我有一个名为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吗?
答案 0 :(得分:0)
使用C#和其他基于.Net的语言要记住的重要事项是强类型类和非强类型类之间的区别。 在实践中,动力学(非强类型)通常被认为是快速发展的懒人方法。 除非你真的需要,否则不建议使用Dynamics作为捕获所有方法。
有很多方法可以实现您的目标,但是,如果您希望与班级互动,最终必须在运行时使用动力学。
你应该看看的是Newtonsoft.Json。 使用Json,您可以将C#类转换为JObject,然后将其操作,就好像它是一个Dictionary。 这将允许您追加额外的字段和属性,但不能追加方法。 完成对象的修改后,可以将其转换回动态,然后将其作为普通的expando对象进行交互。
如果您确实想在运行时创建强类型类,那么您需要查看运行时编译。这将使用C#CodeDom提供程序,并允许您编译文本&#39;进入包含一种或多种类型的C Sharp组件。这些类型可以是从您提供的文本输入成功编译的任何类型。