我对 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
}
}
动态方法(??):
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();
}
酷,干杯
EDIT:
进一步思考我的问题,并根据答案,我发现我完全搞乱了主要的通用/动态问题。他们确实是完全不同的。所以是的,感谢您提供的所有信息。
那么第 2 点呢?
dynamic
可能会简化有限数量的反射场景(您预先知道成员名称,但没有接口) - 特别是,它可能有助于通用运算符(尽管存在其他答案) - 但除了泛型运算符技巧之外,与泛型几乎没有交叉。
泛型允许您(在编译时)了解您正在使用的类型 - 相反,dynamic
不care关于类型。
特别是 - 泛型允许您指定和证明许多条件about类型 - 即它可能实现某些接口,或者具有公共无参数构造函数。dynamic
两者都没有帮助:它不支持接口,比简单地不关心接口更糟糕的是,这意味着我们甚至不能see显式接口实现dynamic
.
此外,dynamic
确实是一个特例object
,所以拳击开始发挥作用,但具有复仇性。
事实上,你应该限制你的使用dynamic
分几种情况:
- COM互操作
- DLR 互操作
-
maybe一些轻量级的鸭子打字
-
maybe一些通用运算符
对于所有其他情况,泛型和常规 C# 是最佳选择。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)