【问题标题】:Can an ExpandoObject have a strongly typed parent?ExpandoObject 可以有一个强类型的父对象吗?
【发布时间】:2021-10-04 01:04:44
【问题描述】:
使用 ExpandoObject,是否可以对具有类型属性的类进行子类化,并且只动态添加运行时出现的属性?
class TypedProperties
{
public int KnownIntProperty { get; set; }
public string KnownStringProperty { get; set; }
}
想象在我的代码中,我必须动态添加一个属性SecondStringProperty,但仍想利用TypedProperties。我该怎么做?
【问题讨论】:
标签:
c#
dynamic
subclass
expandoobject
【解决方案1】:
你当然不能让你的 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'