如果要创建自己的动态对象,该怎么办?有两种方法:从DynamicObject中派生,或者使用ExpandObject。使用DynamicObject需要做的工作较多,因为必须重写几个方法。ExpandObject是一个可立即使用的密封类。
1. DynamicObject
考虑一个表示人的对象。一般应定义名字、中间名和姓氏等属性。现在假定要在运行期间构建这个对象,且系统事先不知道该对象有什么属性或该对象可能支持什么方法。此时就可以使用基于DynamicObject的对象。需要这类功能的场合几乎没有,但到目前为止,C#语言还没有提供该功能。
首先看看DynamicObject:
public class WroxDynamicObject:DynamicObject
{
private Dictionary<string,object> _dinamicData = new Dictionary<string, object>();
public override bool TryGetMember(GetMemberBinder binder, out object result)
{
bool success = false;
result = null;
if(_dinamicData.ContainsKey(binder.Name))
{
result = _dinamicData[binder.Name];
success = true;
}
else
{
result = "Property Not Found";
}
return success;
}
public override bool TrySetMember(SetMemberBinder binder, object value)
{
_dinamicData[binder.Name] = value;
return true;
}
public override bool TryInvokeMember(InvokeMemberBinder binder, object[] args, out object result)
{
dynamic method = _dinamicData[binder.Name];
result = method((DateTime)args[0]);
return result != null;
}
在这个示例中,重写了3个方法TyrGetMember()、TrySetMember()和TryInvokeMember()。
TrySetMember()方法给对象添加了新方法、属性或字段。本例把成员信息存储在一个Dictionary对象中。传送给TrySetMember()方法的SetMemberBInder对象包含Name属性,它用于标识Dictionary中的元素。
TryGetMember()方法根据GetMemberBinder对象的Name属性检索储存在Dictionary中的对象。
下面的代码使用了刚才新建的动态对象:
dynamic wroxDyn = new WroxDynamicObject();
wroxDyn.FirstName = "Bugs";
wroxDyn.LastName = "Bunny";
System.Console.WriteLine(wroxDyn.GetType());
System.Console.WriteLine($"{wroxDy