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

Can an ExpandoObject have a strongly typed parent?

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

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

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

您当然不能让您的 ExpandoObject 继承自其他 class,因为继承是固定的,基数 class 是 System.Object。

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

您可以编写代码,将属性及其值动态添加到您的 ExpandoObject - 您可以在另一个 classes 实例中找到。

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'