【问题标题】:cast dynamic object in other type .net将动态对象转换为其他类型的 .net
【发布时间】:2013-07-11 06:00:41
【问题描述】:

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

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 对象,但我无法访问我动态添加的字段。 谢谢

【问题讨论】:

    标签: .net casting


    【解决方案1】:

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

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

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

    【讨论】:

      猜你喜欢
      • 2012-01-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-01-30
      • 2011-08-31
      相关资源
      最近更新 更多