dynamic 是c#中的一个关键字,用来表示动态类型,即在运行时确定类型。
dynamic value;
Random ran = new Random();//生成随机数
value = ran.Next(0, 10) > 5 ? (dynamic)1 : (dynamic)"A";
dynamic display = value + value;
Console.WriteLine(value);
程序输出随着随机数变化而不确定,
当随机数小于5时 value = 1,display=1 + 1 最后输出2;
当随机数大于5时 value = “A”,,display = “A” + “A” 最后输出“AA”;
dynamic本质上是object,方法不能靠dynamic和object来区分
即Method(object o)和Method(dynamic d)其实是一样的。
如果想要使自定义的类型支持dynamic ,需要实现IDynamicMetaObjectProvider接口,其中有GetMetaObject方法,返回DynamicMetaObject的一个派生类型,
这个类型可以处理自定义类型对象的方法、字段、属性等
dynamic只能支持访问实例对象的方法、字段、属性,因为dynamic必须是一个对象。如果想要动态访问类型的静态成员,可以定义一个
StaticDynamic类型派生自System.Dynamic.DynamicObject,重载其中
public override bool TryGetMember(GetMemberBinder binder, out object result)
public override bool TrySetMember(SetMemberBinder binder, object value)
public override bool TryInvokeMember(InvokeMemberBinder binder, object[] args, out object result)
重载方法,使用反射技术查询类型静态成员,并加以操作。