C#:将反射类型传递给类构造函数

时间:2018-05-17 16:32:52

标签: c# reflection

我有一个通用的方法,它接受一个任意的JObject(来自JSON.net)并将其转换为一般类型的对象。

因此,让我们简化转换方法,如下所示:

private async Task<T> ConvertToObject(JObject obj) {
    //Lots of other stuff yielding in the creation of newObj
    var result = newObj.ToObject<T>();
    return result;
}

现在这个方法可以正常工作,但是我想修改方法,这样我就可以对我的JObject中不可用的泛型对象中的复杂属性做同样的事情(例如,我必须查看它们单独进行,执行相同的转换并应用于此对象结果)。

到目前为止,我的方法是循环遍历所有属性,识别复杂类型,执行查找以从我的数据存储中检索它们的值,然后针对它们执行上述操作(如果它们也有任何复杂对象,可能会递归执行),然后将该值写回此复杂属性,重复其他任何其他属性,然后像之前一样返回该结果。

我通过Reflection:

检索属性
var properties = result.GetType().GetProperties();
foreach (var property in properties) {
  if (IsSimple(property.PropertyType)
    continue;

  //Do external lookup

  var convertedValue = new ConversionTool<>().Lookup(query);
}

现在,最后一行是我遇到问题的地方。我希望将类名传递给它,而不只是一个类型,但我只知道上面的反射方法在运行时的类型。我在http://www.paulbatum.com/2008/08/less-fragile-way-to-invoke-generic.html发现了一篇文章,详细说明了如何将这种泛型类型传递给方法,并解释了在评论中使用Activator.CreateInstance的问题,但是看起来我知道类型I& #39;我想放在那里 - 我只是不知道它直到它运行(我通过反射检索它)。

这似乎是ORM在填充其实体的复杂属性时遇到的问题,但我很难找到他们如何做到这一点。

鉴于此方法的调用者在运行时知道预期的类型是什么,我如何将该类型传递给泛型类构造函数,以便我可以递归地为给定类型的每个复杂成员调用它?

0 个答案:

没有答案