添加新的动态属性

时间:2010-12-15 14:38:41

标签: c#-4.0

我们在msdn中读到了使用DynamicObject Class“添加新的动态属性”  我写了一个以下的程序

public class DemoDynamicObject : DynamicObject
{

}
class Program
{
    public static void Main()
    {
        dynamic dd = new DemoDynamicObject();
        dd.FirstName = "abc";
    }
}

但是当我运行这个程序时,它会给出运行时错误:'DemoDynamicObject'不包含'FirstName'的定义 如果我们使用DynamicObject Class添加动态属性,那么它为什么会出现此错误 谁能告诉我理由和解决方案?

1 个答案:

答案 0 :(得分:9)

使用DynamicObject作为基类时,应该为TryGetMember和TrySetMember提供特定的覆盖,以跟踪您正在创建的动态属性(基于DynamicObject MSDN documentation):

class DemoDynamicObject: DynamicObject
{
    Dictionary<string, object> dictionary
        = new Dictionary<string, object>();

    public override bool TryGetMember(
        GetMemberBinder binder, out object result)
    {
        string name = binder.Name;
        return dictionary.TryGetValue(name, out result);
    }

    public override bool TrySetMember(
        SetMemberBinder binder, object value)
    {
        dictionary[binder.Name] = value;
        return true;
    }
}

如果您只想拥有一个可以添加属性的动态对象,则只需使用ExpandoObject实例,并跳过继承自DynamicObject的自定义类。