【问题标题】: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'
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-07-14
      • 1970-01-01
      • 2017-04-17
      • 1970-01-01
      • 1970-01-01
      • 2017-06-17
      • 2019-06-15
      相关资源
      最近更新 更多