我对C#(C#4 dynamic keyword - why not?)中的动态功能感到非常兴奋,特别是因为在我的代码的某些库部分中我使用了很多反射。
我的问题有两个:
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
}
}
动态方法(??):
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
}
}
2。 “动态”现在是否允许方法返回匿名类型,如下面的情况?:
public static List<dynamic> ReturnAnonymousType() {
return MyDataContext.SomeEntities.Entity.Select(e => e.Property1, e.Property2).ToList();
}
酷,欢呼声
修改
仔细考虑了我的问题,并根据答案,我看到我完全搞砸了主要的通用/动态问题。他们的确完全不同。所以,是的,感谢所有的信息。
虽然第2点怎么样?
答案 0 :(得分:17)
回答你的问题。 否强>
List<T>
然后我可以将它用于字符串列表,整数等... dynamic
关键字会给你的是
答案 1 :(得分:16)
dynamic
可能会简化有限数量的反射场景(您事先知道成员名称,但没有接口) - 特别是,它可能有助于泛型运算符(although other answers exist) - 但除了通用运算符技巧之外,与泛型几乎没有交叉。
泛型允许您(在编译时)知道您正在使用的类型 - 相反,dynamic
不会关注类型。
特别是 - 泛型允许您指定和证明关于类型的许多条件 - 即它可能实现某个接口,或者具有公共无参数构造函数。 dynamic
也没有帮助:它不支持接口,而不仅仅是不关心接口,这意味着我们甚至无法使用{{查看显式接口实现1}}。
此外,dynamic
实际上是dynamic
的一个特例,所以拳击发挥作用,但有一个疏忽。
实际上,您应该将object
的使用限制在少数情况下:
对于所有其他情况,可以使用泛型和常规C#。
答案 2 :(得分:8)
要回答您的第一个问题,泛型会在运行时解析编译时的动态类型。因此,类型安全性和速度存在明显差异。
答案 3 :(得分:6)
动态类和泛型是完全不同的概念。使用泛型,您可以在编译时定义类型。它们不会改变,它们不是动态的。您只需将“占位符”放在某个类或方法中,以使调用代码定义类型。
动态方法在运行时定义。那里没有编译时类型安全。动态类与使用反射的字符串名称具有对象引用和调用方法类似。
答案 4 :(得分:3)
回答第二个问题:您可以在C#3.0中返回匿名类型。将类型转换为对象,返回它并使用反射来访问它的成员。动态关键字只是语法糖。