and*_*ndy 9 .net c# generics reflection dynamic
我对C#中的动态特性感到非常兴奋(C#4动态关键字 - 为什么不呢?),特别是因为在我的代码的某些库部分我使用了很多反射.
我的问题是双重的:
1."动态"取代泛型,如下面的情况?
泛型方法:
public static void Do_Something_If_Object_Not_Null<SomeType>(SomeType ObjToTest) {
//test object is not null, regardless of its Type
if (!EqualityComparer<SomeType>.Default.Equals(ObjToTest, default(SomeType))) {
//do something
}
}
Run Code Online (Sandbox Code Playgroud)
动态方法(??):
public static void Do_Something_If_Object_Not_Null(dynamic ObjToTest) {
//test object is not null, regardless of its Type?? but how?
if (ObjToTest != null) {
//do something
}
}
Run Code Online (Sandbox Code Playgroud)
2."动态"现在是否允许方法返回匿名类型,如下面的情况?:
public static List<dynamic> ReturnAnonymousType() {
return MyDataContext.SomeEntities.Entity.Select(e => e.Property1, e.Property2).ToList();
}
Run Code Online (Sandbox Code Playgroud)
很酷,欢呼
编辑:
仔细考虑了我的问题,并根据答案,我看到我完全搞砸了主要的通用/动态问题.他们的确完全不同.所以是的,感谢所有的信息.
那么第2点怎么样?
Gis*_*shu 17
回答你的问题.没有.
List<T>,然后我可以使用它的字符串列表,整数等...什么dynamic关键字会给你是
Mar*_*ell 17
dynamic可能会简化有限数量的反射场景(你事先知道成员名称,但没有接口) - 特别是,它可能有助于泛型运算符(尽管存在其他答案) - 但除了泛型运算符技巧之外,与泛型几乎没有交叉.
泛型允许您(在编译时)知道您正在使用的类型 - 相反,dynamic不关心类型.特别是 - 泛型允许您指定和证明关于类型的许多条件- 即它可能实现某个接口,或者具有公共无参数构造函数.dynamic两者都没有帮助:它不支持接口,而不仅仅是不关心接口,这意味着我们甚至看不到明确的接口实现dynamic.
另外,dynamic真的是一个特例object,所以拳击发挥作用,但有一个疏远.
实际上,您应该限制使用dynamic几种情况:
对于所有其他情况,泛型和常规C#是要走的路.
为了回答你的第一个问题,泛型在运行时解析编译时,动态类型.因此,在类型安全性和速度方面存在明显差异.
动态类和泛型是完全不同的概念.使用泛型,您可以在编译时定义类型.它们不会改变,它们不是动态的.您只需将"占位符"放入某个类或方法,以使调用代码定义类型.
动态方法在运行时定义.那里没有编译时类型安全.动态类类似于对象引用和使用反射通过其字符串名称调用方法.