我来自Java背景,我正在从c#中的等价物中寻找以下内容.
public interface Reader {
<T> T read(Class<? extends T> type);
}
Run Code Online (Sandbox Code Playgroud)
这样我可以执行以下操作,约束参数并推断返回类型.
Cat cat = reader.read(Cat.class);
Dog dog = reader.read(Dog.class);
Run Code Online (Sandbox Code Playgroud)
我希望这样的东西可以在c#中运行,但我不确定它会不会.
public interface Reader {
T Read<T>();
}
Run Code Online (Sandbox Code Playgroud)
而且这样做.
public class TypeReader : Reader {
public T Read<T>() {
Type type = T.GetType();
...
}
}
Run Code Online (Sandbox Code Playgroud)
这样的事情在c#中是否可能?
(我正在使用gcc -O2.)
这似乎是一个简单的机会来消除复制构造函数,因为访问a bar的副本中的字段值没有副作用foo; 但拷贝构造函数被调用,因为我得到的输出meep meep!.
#include <iostream>
struct foo {
foo(): a(5) { }
foo(const foo& f): a(f.a) { std::cout << "meep meep!\n"; }
int a;
};
struct bar {
foo F() const { return f; }
foo f;
};
int main()
{
bar b;
int a = b.F().a;
return 0;
}
Run Code Online (Sandbox Code Playgroud) 我有一个项目,我必须用双变量进行一些数学计算.问题是我在SUN Solaris 9和Linux上获得了不同的结果.有很多方法(在这里和其他论坛解释)如何使Linux作为Sun工作,但不是相反.我无法触及Linux代码,所以只有SUN才能改变.有没有办法让SUN像Linux一样行事?
我运行的代码(在两个系统上使用gcc编译):
int hash_func(char *long_id)
{
double product, lnum, gold;
while (*long_id)
lnum = lnum * 10.0 + (*long_id++ - '0');
printf("lnum => %20.20f\n", lnum);
lnum = lnum * 10.0E-8;
printf("lnum => %20.20f\n", lnum);
gold = 0.6125423371582974;
product = lnum * gold;
printf("product => %20.20f\n", product);
...
}
Run Code Online (Sandbox Code Playgroud)
如果输入是339886769243483
Linux中的输出:
lnum => 339886769243**483**.00000000000000000000
lnum => 33988676.9243**4829473495483398**
product => 20819503.600158**59827399253845**
Run Code Online (Sandbox Code Playgroud)
在SUN上:
lnum => 339886769243483.00000000000000000000
lnum => 33988676.92434830218553543091
product = 20819503.600158**60199928283691**
Run Code Online (Sandbox Code Playgroud)
注意:结果并不总是不同,而且大多数时候它是相同的.60000中只有10个15位数字有这个问题.
请帮忙!!!
我目前有一个NSView绘制网格图案(基本上是水平和垂直线的指南),其想法是用户可以更改网格的间距和网格的颜色.
网格的目的是在排列对象时充当用户的指导.除了一个例外,一切正常.当我NSWindow通过拖动调整大小手柄调整大小时,如果我的网格间距特别小(比如10像素).阻力调整大小变得昏昏欲睡.
我drawRect的网格代码如下:
-(void)drawRect:(NSRect)dirtyRect {
NSRect thisViewSize = [self bounds];
// Set the line color
[[NSColor colorWithDeviceRed:0
green:(255/255.0)
blue:(255/255.0)
alpha:1] set];
// Draw the vertical lines first
NSBezierPath * verticalLinePath = [NSBezierPath bezierPath];
int gridWidth = thisViewSize.size.width;
int gridHeight = thisViewSize.size.height;
int i;
while (i < gridWidth)
{
i = i + [self currentSpacing];
NSPoint startPoint = {i,0};
NSPoint endPoint = {i, gridHeight};
[verticalLinePath setLineWidth:1];
[verticalLinePath moveToPoint:startPoint];
[verticalLinePath lineToPoint:endPoint];
[verticalLinePath stroke];
}
// Draw …Run Code Online (Sandbox Code Playgroud) 我正在使用PropertyDescriptor和ICustomTypeDescriptor(仍然)尝试将WPF DataGrid绑定到一个对象,数据存储在一个Dictionary中.
因为如果你向WPF DataGrid传递一个Dictionary对象列表,它将根据字典的公共属性(Comparer,Count,Keys和Values)自动生成列,我的Person子类为Dictionary,并实现ICustomTypeDescriptor.
ICustomTypeDescriptor定义了一个返回PropertyDescriptorCollection的GetProperties方法.
PropertyDescriptor是抽象的,所以你必须将它子类化,我想我有一个构造函数,它接受Func和一个Action参数,它们委托字典中值的获取和设置.
然后我为字典中的每个Key创建一个PersonPropertyDescriptor,如下所示:
foreach (string s in this.Keys)
{
var descriptor = new PersonPropertyDescriptor(
s,
new Func<object>(() => { return this[s]; }),
new Action<object>(o => { this[s] = o; }));
propList.Add(descriptor);
}
Run Code Online (Sandbox Code Playgroud)
问题是每个属性得到它自己的Func和Action但它们都共享外部变量s所以尽管DataGrid自动生成"ID","FirstName","LastName","Age","Gender"的列,它们都得到了设置为"性别",这是foreach循环中s的最终静止值.
如何确保每个委托使用所需的字典密钥,即Func/Action实例化时的s值?
非常感谢.
这是我的其余想法,我只是在这里尝试这些不是'真正'的类......
// DataGrid binds to a People instance
public class People : List<Person>
{
public People()
{
this.Add(new Person());
}
}
public class Person : Dictionary<string, object>, ICustomTypeDescriptor
{
private static PropertyDescriptorCollection descriptors;
public Person() …Run Code Online (Sandbox Code Playgroud) 我花了剩下的时间阅读StackOverflow问题,还有一些关于这个主题的博客文章和链接.所有这些都证明是非常有帮助的,但我仍然觉得他们并没有真正回答我的问题.
所以,我正在开发一个简单的Web应用程序.我想创建一个可重用的数据访问层,以后我可以在其他解决方案中重用它.其中99%将是Web应用程序.这似乎是我学习NHibernate及其周围模式的一个很好的借口.
我的目标如下:
考虑到这一切,我决定使用流行的存储库模式.我在这个网站和各种开发博客上阅读了这个主题,我听到了一些关于工作单元模式的内容.
我也环顾四周,检查了各种实现.(包括FubuMVC contrib,SharpArchitecture,以及一些博客上的内容.)我发现大多数这些操作都遵循相同的原则:它们创建了一个"工作单元",在实例化存储库时实例化,它们启动一个事务,做东西,提交,然后重新开始.所以,只有一个ISession每次Repository仅此而已.然后客户端代码需要实例化一个存储库,用它做一些东西,然后处理.
这种使用模式不符合我尽可能简单化的需要,所以我开始考虑其他事情.
我发现NHibernate已经有了使自定义"工作单元"实现变得不必要的东西,那就是CurrentSessionContext类.如果我正确配置会话上下文,并在必要时进行清理,我很高兴.
所以,我想出了这个:
我有一个内部静态类叫NHibernateHelper.首先,它有一个名为的静态属性CurrentSessionFactory,在第一次调用时,实例化会话工厂并将其存储在静态字段中.(ISessionFactory每个人一个AppDomain就足够了.)然后,更重要的是,它有一个CurrentSession静态属性,它检查是否ISession绑定到当前会话上下文,如果没有,则创建一个,并绑定它,然后返回ISession绑定到当前的会话上下文.
因为它主要用于WebSessionContext(所以,ISession每个HttpRequest,虽然对于我配置的单元测试ThreadStaticSessionContext),它应该无缝地工作.在创建并绑定an之后ISession,它会将事件处理程序挂钩到HttpContext.Current.ApplicationInstance.EndRequest事件,该事件处理ISession请求结束后的清理.(当然,只有当它真的在Web环境中运行时才会这样做.)
因此,通过所有这些设置,NHibernateHelper将始终能够返回有效的ISession,因此无需为"工作单元"实例化Repository实例以使其正常运行.相反,Repository是与工作的静态类ISession从NHibernateHelper.CurrentSession性能,并通过通用的方法,公开通过该功能.
所以,基本上,我最终得到了两个非常懒惰的单身人士.
我好奇,你怎么看待这个?这是一种有效的思维方式,还是我完全偏离了这里?
编辑:
我必须指出NHibernateHelper类是内部的,因此对于存储库的使用者来说几乎是不可见的.
另一个想法是,为了将依赖注入引入解决方案,就是创建一个名为的接口IDataProvider,并在第一次调用Repository该类时实例化该接口的一个实例.(但是,实现代码也应该能够关注上下文的概念.)
编辑2:
似乎很多人都喜欢我的想法,但在答案中对它的看法仍然太少.
我可以假设这是使用NHibernate的正确方法吗?:P
我正在使用TcpClient在端口上侦听请求.当请求从客户端进来时,我想知道发出请求的客户端ip.
我试过了:
Console.WriteLine(tcpClient.Client.RemoteEndPoint.ToString());
Console.WriteLine(tcpClient.Client.LocalEndPoint.ToString());
var networkStream = tcpClient.GetStream();
var pi = networkStream.GetType().GetProperty("Socket", BindingFlags.NonPublic | BindingFlags.Instance);
var socketIp = ((Socket)pi.GetValue(networkStream, null)).RemoteEndPoint.ToString();
Console.WriteLine(socketIp);
Run Code Online (Sandbox Code Playgroud)
所有这些地址都输出10.xxx地址,这些地址是私有地址,显然不是我网络上发出请求的客户端的地址.如何获取发出请求的客户端的公共IP?
编辑: 我们正在使用带有tcp转发的Amazon EC2负载均衡器.有没有办法在这个设置中获得真正的客户端IP?
我最近遇到了一个看起来像这样的例程:
procedure TMyForm.DoSomething(list: TList<TMyObject>; const flag: boolean);
var
local: integer;
begin
if flag then
//do something
else local := ExpensiveFunctionCallThatCalculatesSomething;
//do something else
for i := 0 to list.Count do
if flag then
//do something
else if list[i].IntValue > local then //WARNING HERE
//do something else
end;
Run Code Online (Sandbox Code Playgroud)
这使得Variable 'local' might not have been initialized即使你可以通过阅读,除非初始化它的代码分支已经运行,你不会碰到该行代码告诉.
现在,我可以local := 0;在程序的顶部添加一个无用的东西来摆脱这个警告,但我想知道是否可能没有更好的方法来构建它来避免这个问题.有人有主意吗?
使用java的正则表达式可用于过滤掉破折号' - '并从表示电话号码的字符串中打开紧密的圆括号...
所以(234)887-9999应该给2348879999,类似地234-887-9999应该给2348879999.
谢谢,
我在typedef的boost :: shared_ptr模板的命名约定之间翻转.例如:
typedef boost::shared_ptr<Foo> FooPtr;
Run Code Online (Sandbox Code Playgroud)
在制定一项公约之前,我想看看其他人使用什么.你的约定是什么?
编辑:
对于那些在Foo中嵌入typedef的人来说,Foo现在"意识到"它将如何被传递并不会让你烦恼吗?它似乎打破了封装.这个怎么样:
class Foo
{
public:
typedef std::vector<Foo> Vector
};
Run Code Online (Sandbox Code Playgroud)
你现在不会这样做,对吗?:-)
c# ×3
.net ×2
c++ ×2
java ×2
asp.net ×1
boost ×1
cocoa ×1
constructor ×1
delphi ×1
drawrect ×1
generics ×1
grid ×1
lambda ×1
linux ×1
nhibernate ×1
nsview ×1
objective-c ×1
optimization ×1
orm ×1
phone-number ×1
refactoring ×1
regex ×1
shared-ptr ×1
solaris ×1
tcpclient ×1
wpfdatagrid ×1