dynamic类型是.NET 4.0引入的一个新的概念,它的目的是增强与python等动态语言的互操作性。由于动态的原因,使得dynamic类型的变量只有在运行时才能被确定具体类型,而编译器也会绕过对这种类型的语法检查。其实这样做是危险的。
下面的代码演示了在C#中如何使用dynamic类型:
123456789101112131415 | class Person { public string Name { get ; set ; } } class Program { static void Main( string [] args) { dynamic c = new Person(); c.Name = "abc" ; c.Age = 30; Console.WriteLine(c.Name); } } |
这段代码是可以编译通过的,尽管Person类中并没有定义Age这个公有属性,因为c的类型是在运行时动态绑定的,因此,执行这段代码时就会出现错误:
由于编译器会忽略由dynamic定义的变量,因此它能够用来解决一些与强类型“冲突”的问题。不知您是否还记得我之前写的一篇关于泛型的接口抽象的文章。那么,我们可以使用dynamic变量来解决这篇文章中提出的问题。代码如下:
public interface IXRefData { // TODO: add definition here } public class XRefComponent<TData> where TData : IXRefData { public void Update() { } } public class XRefPickData : IXRefData { } public class XRefPackData : IXRefData { } public class XRefUpdator { private List<dynamic> components = new List<dynamic>(); public List<dynamic> Components { get { return components; } set { components = value; } } } class Program { static void Main( string [] args) { XRefUpdator updator = new XRefUpdator(); // 现在就可以将两种完全不同的类型添加到Component列表中了 updator.Components.Add( new XRefComponent<XRefPickData>()); updator.Components.Add( new XRefComponent<XRefPackData>()); } } |
最后提一句,使用dynamic的程序最好做一下单体测试,因为它可能带来更多的运行时错误。