使用Dictionary <string,object>创建动态类

时间:2018-02-19 06:36:18

标签: c# dictionary expandoobject dynamicobject

我有一个名为CoverageBase的类,其属性为A,B,C。现在基于一些检查,我需要在此CoverageBase类中添加n个属性,即D和E属性以及我现有的A,B, C.因此,在运行期间动态创建D和E我正在使用Dictionary

class CoverageBase
{
   public string A { get; set; }
   public string B { get; set; }
   public string C { get; set; }
}

Dictionary<string, object> values = new Dictionary<string, object>()
{
  {"D",5},{"E",123}
};

var test = GetObject<CoverageBase>(values);

T GetObject<T>(Dictionary<string,object> dict)
{
  Type type = typeof(T);
  var obj = Activator.CreateInstance(type);

  foreach (var kv in dict)
  {
    type.GetProperty(kv.Key).SetValue(obj, kv.Value);
  }
  return (T)obj;
}

上述方法的问题是,当我尝试使用“D”的GetProperty时,CoverageBase类中的该名称中不存在任何属性。所以它会抛出错误。那么我如何用属性A,B,C,D,E构建我期望的类

我们可以使用任何现有的工具,比如ExpandoObject或DynamicObject吗?

1 个答案:

答案 0 :(得分:0)

使用C#和其他基于.Net的语言要记住的重要事项是强类型类和非强类型类之间的区别。 在实践中,动力学(非强类型)通常被认为是快速发展的懒人方法。 除非你真的需要,否则不建议使用Dynamics作为捕获所有方法。

有很多方法可以实现您的目标,但是,如果您希望与班级互动,最终必须在运行时使用动力学。

你应该看看的是Newtonsoft.Json。 使用Json,您可以将C#类转换为JObject,然后将其操作,就好像它是一个Dictionary。 这将允许您追加额外的字段和属性,但不能追加方法。 完成对象的修改后,可以将其转换回动态,然后将其作为普通的expando对象进行交互。

如果您确实想在运行时创建强类型类,那么您需要查看运行时编译。这将使用C#CodeDom提供程序,并允许您编译文本&#39;进入包含一种或多种类型的C Sharp组件。这些类型可以是从您提供的文本输入成功编译的任何类型。