ExpandoObject可以有强类型父对象吗?



使用ExpandoObject,是否有可能子类化具有类型化属性的类,并且仅动态添加在运行时出现的属性?

class TypedProperties
{
public int KnownIntProperty { get; set; }
public string KnownStringProperty { get; set; }
}

想象一下,在我的代码中,我必须动态地添加一个属性SecondStringProperty,但仍然想利用TypedProperties。我该怎么做呢?

你当然不能让你的ExpandoObject从其他类继承,因为继承是固定的,基类是System.Object。

你也不能继承ExpandoObject因为它是密封的。因此,如果你想同时拥有类型安全的、非动态的规则声明属性和动态添加的属性,这就变得很棘手了,你可能只需要将一个expando对象映射到一个现有的对象,所以expando就像是非动态实例的代理。

你可以编写代码动态地将属性和它们的值添加到你的ExpandoObject中——你可以在另一个类实例中找到。

ExpandoObject本质上是一个属性名和它们的值的IDictionary<string, object>

var expando = new ExpandoObject();
expando.SecondStringProperty = "2nd string";
IDictionary<string, object> expandoDic = expando;
var obj = new TypedProperties { ... };
foreach (var p in obj.GetType().GetProperties())
{
expandoDic.Add(p.Name, p.GetValue(obj));
}
//'expando' now contains all public props+values of obj plus the additional prop 'SecondStringProperty'

最新更新