C#4.0“动态”关键字是否会使generics多余?

我对C#中的动态特性感到非常兴奋( C#4动态关键字 – 为什么不呢? ),特别是因为在我的代码的某些库部分我使用了很多reflection。

我的问题有两个:

1.“动态”取代generics,如下所示?

generics方法:

public static void Do_Something_If_Object_Not_Null(SomeType ObjToTest) { //test object is not null, regardless of its Type if (!EqualityComparer.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 ReturnAnonymousType() { return MyDataContext.SomeEntities.Entity.Select(e => e.Property1, e.Property2).ToList(); } 

很酷,干杯

编辑:

仔细考虑了我的问题,并根据答案,我看到我完全搞砸了主要的通用/动态问题。 他们确实完全不同。 所以是的,谢谢所有的信息。

那么第2点怎么样?

dynamic可能会简化有限数量的reflection场景(前面你知道成员名称,但没有接口) – 特别是,它可能有助于generics运算符( 尽管存在其他答案 ) – 但除了generics运算符之外,与generics几乎没有交叉。

generics允许您(在编译时)知道您正在使用的类型 – 相反, dynamic关心类型。 特别是 – generics允许您指定和certificate关于类型的许多条件 – 即它可能实现某个接口,或者具有公共无参数构造函数。 dynamic并没有帮助:它不支持接口,而不仅仅是不关心接口,这意味着我们甚至看不到 dynamic显式接口实现。

另外, dynamic实际上是一个特殊的object案例,所以拳击发挥作用,但有一个疏远。

实际上,您应该将dynamic使用限制在以下几种情况:

  • COM互操作
  • DLR互操作
  • 也许是一些轻鸭子打字
  • 也许是一些通用运营商

对于所有其他情况,generics和常规C#是要走的路。

回答你的问题。 没有。

  • generics为您提供“ 算法重用 ” – 您可以编写独立于数据类型的代码。 dynamic关键字不会执行与此相关的任何操作。 我定义List然后我可以将它用于字符串列表,整数等…
  • 类型安全 :整个编译时间检查辩论。 动态变量不会通过编译时警告/错误提醒您,如果您犯了错误,如果您尝试调用的方法丢失,它们将在运行时爆炸。 静态与动态类型争论
  • 性能 :generics使用值类型提高了算法/代码的性能了很多个数量级。 它可以防止整个拳击 – 拆箱周期花费我们之前的generics。 Dynamic也没有为此做任何事情。

dynamic关键字给你的是什么

  • 更简单的代码(当您与Excel进行互操作时,可以说..)您不需要指定类的名称或对象模型。 如果调用正确的方法,则运行时将负责调用该方法(如果该方法当时存在)。 即使未定义方法,编译器也可让您逃脱。 但是,这意味着这将比进行编译器validation/静态类型的方法调用慢,因为CLR必须在进行动态var字段/方法调用之前执行检查。
  • 动态变量可以在不同的时间点保存不同类型的对象 – 您不受特定系列或对象类型的约束。

为了回答你的第一个问题,generics在运行时解析编译时,动态类型。 因此,类型安全性和速度存在明显差异。

动态类和generics是完全不同的概念。 使用generics,您可以在编译时定义类型。 它们不会改变,它们不是动态的。 您只需将“占位符”放入某个类或方法,以使调用代码定义类型。

动态方法在运行时定义。 那里没有编译时类型安全。 动态类与使用reflection通过其字符串名称具有对象引用和调用方法类似。

回答第二个问题:您可以在C#3.0中返回匿名类型。 将类型转换为对象,返回它并使用reflection来访问它的成员。 动态关键字只是语法糖。