C#动态类型

自C#4.0开始,可以使用动态类型。动态类型使用dynamic来定义。

使用动态类型


dynamic obj = new Object();

obj.Abc();

在编译时,编译器并不检查动态类型是否有对应的成员,总是会生成调用代码。 编译后的动态类型就是普通的object类型。 object类型并没有Abc方法,因此运行时会报异常。

ExpandoObject

System.Dynamic.ExpandoObject表示可以任意添加删除成员的动态类型。


dynamic obj = new ExpandoObject();

obj.a = 1;

obj.b = "ok";

obj.c = new Action(()=>{
    Console.WriteLine("ok");
});

obj.a = null;

obj.c();

实现自己的动态类型

通过继承System.Dynamic.DynamicObject,实现特定的方法,可以控制动态类型的行为。


public class MyDynamic : DynamicObject
    {
        Dictionary<string, object> dict
            = new Dictionary<string, object>(StringComparer.OrdinalIgnoreCase);

        public override Boolean TryGetMember(GetMemberBinder binder, out Object result)
        {
            return dict.TryGetValue(binder.Name, out result);
        }

        public override Boolean TrySetMember(SetMemberBinder binder, Object value)
        {
            dict[binder.Name] = value;
            return true;
        }

        public override IEnumerable<String> GetDynamicMemberNames()
        {
            return dict.Keys;
        }
    }

上面的动态类型实现了不区分大小写的成员访问。

动态类型的优缺点