1

.net 4 引入了动态对象,您可以在其中在运行时分配属性。我有动态对象,需要将其转换为另一种类型。以下是代码片段

public class eObject : DynamicObject
{

        Dictionary<string, object> m_dictFields = new Dictionary<string, object>();

        private string m_strName;
        public string Name
        {
            get { return m_strName; }
            set { m_strName = value; }
        }

public override bool TryGetMember(GetMemberBinder binder, out object result)
 {
   if (m_dictFields.ContainsKey(binder.Name))
   {
    result = m_dictFields[binder.Name];
    return true;
  }
 else
 {
    return base.TryGetMember(binder, out result);
 }
}

public override bool TrySetMember(SetMemberBinder binder, object value)
 {
    if (!m_dictFields.ContainsKey(binder.Name))
      m_dictFields.Add(binder.Name, value);
    else
      m_dictFields[binder.Name] = value;
    return true;
 }
}



   // now I am assigning properties to my dynamic object as 

    static void Main(string[] args)
    {
        dynamic organization = new eObject();
        organization.Name = "Test Org Name";
        organization.ModifiedOn = DateTime.Now;
        organization.CreatedOn = DateTime.Now;
        organization.ModifiedBy = "Test Modified by";
        oganization.CreatedBy = "Test User";
        // this is what i have done
        eObject newOrg = organization as eObject;

        Console.WriteLine("Org Name: " +organization.Name);  // working            

        Console.WriteLine("Org Name: " +newOrg.Name);  // not working

    }

我正在获取 newOrg 对象,但我无法访问我动态添加的字段。谢谢

4

1 回答 1

0

当编译器为表达式生成代码时,organization.Name它会检测到变量的类型organizationdynamic。然后它决定将“绑定”过程推迟到执行时间,因为它不知道变量后面的对象organization将具有NameModifiedOn属性。只要动态对象没有相应的成员,方法TryGetMember和将在执行期间被调用。TrySetMember在此示例中TryGetMemberTrySetMember不会为属性 Name 调用,因为它是静态声明的eObject,但将为您定义的其余成员访问调用它们。

当您将变量eObject强制转换为 newOrg 时,编译器将返回静态分析,因此它可以看到 newOrg 引用了一个带有Name属性,但没有ModifiedOn属性,所以特别newOrg.Name会起作用(我不知道你为什么说它不起作用),但newOrg.ModifiedOn不会通过编译器验证,发出以下错误:

    “eObject”不包含“ModifiedBy”的定义,也没有扩展名
    接受“eObject”类型的第一个参数的方法“ModifiedBy”可以是
    找到(您是否缺少 using 指令或程序集引用?)

于 2013-07-14T10:17:35.777 回答