繁体   English   中英

具有ExpandoObject的dynamic关键字,用于附加和删除属性

[英]dynamic keyword with ExpandoObject to attach and remove properties

我知道现在在C#3.0中,我们可以在运行时使用dynamic关键字添加/删除属性,例如将Object作为通用容器的JavaScript概念,但我有一个问题。

它真的是扩展我想要的类型的对象吗?

例如:我们有课:

    class Person
{
    public string Name { get; set; }
    public int Age { get; set;}
}

我将从Person类创建一个新对象:

        dynamic p = new ExpandoObject();

现在这个对象真的是Person类的对象吗? 它不再与Person类无关?

Console.WriteLine(p.GetType()); // System.Dynamic.ExpandoObject

现在,我将为属性设置值,并使用新属性'Foo'扩展对象p:

        p.Age = 25;
        p.Foo = "foo"; 

我重视的新属性“富”和财产“年龄”的设定值,但我做了类型的对象System.Dynamic.ExpandoObject不类型的Person ,所以我在这部分有不匹配的,是我真的扩大从类型对象我需要,我可以使用强制转换来引用这样的对象类型吗?

Console.WriteLine(((Person)p).Name);  

System.Core.dll中发生了类型为“ Microsoft.CSharp.RuntimeBinder.RuntimeBinderException”的未处理异常

我认为您在此混淆了转换和转换的问题。

  • 投射 :更改指向对象的参考类型的动作。 向上或向下移动对象层次结构或移至已实现的界面

  • 转换 :从其他类型的原始源对象创建一个新对象,并通过对该类型的引用对其进行访问。

通常很难知道C# 2之间的区别,因为它们都使用相同的C#运算符:强制转换。

在这种情况下,您几乎肯定不会在寻找强制转换操作。 将一个动态对象转换为另一个动态对象本质上是一个身份转换。 它没有任何价值,因为您只是获得了对同一基础对象的动态引用。 产生的查找没有什么不同。

相反,在这种情况下,您似乎想要的是一次转换。 这就是将基础对象变形为其他类型,并以动态方式访问生成的对象。 最好的API是Convert.ChangeType

public static dynamic Convert(dynamic source, Type dest) {
  return Convert.ChangeType(source, dest);
}

在这种情况下,请使用:

Console.WriteLine(((Person)p).Name);  

尝试:

Console.WriteLine(ConvertTo<Person>(p).Name);  

如果您愿意,我可以编写ConvertTo<T>声明并在此处进行解释。

您不能将这种类型从动态类型转换为实体类型,因为那时该类型与动态无关,除了看起来像它具有相似的属性外,还与动态无关。

但是,您可以序列化动态实例,然后将其反序列化为您拥有的实体类型。 我不确定您为什么要这么做...

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM