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'
使用 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'