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

C#:将反射类型传递给类构造函数,c#,reflection,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(来自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 obj){
//在newObj的创作中,还有很多其他的东西
var result=newObj.ToObject();
返回结果;
}
现在这个方法可以正常工作了,但我想修改这个方法,这样我就可以正确地对通用对象中的复杂属性执行相同的操作,而这些属性在我的JObject中不可用(例如,我必须单独查找它们,执行相同的转换并应用于此对象结果)

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

我正在通过反射检索属性:

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

  //Do external lookup

  var convertedValue = new ConversionTool<>().Lookup(query);
}
var properties=result.GetType().GetProperties();
foreach(属性中的var属性){
if(IsSimple(property.PropertyType)
继续;
//进行外部查找
var convertedValue=new ConversionTool().Lookup(查询);
}
现在,最后一行是我遇到问题的地方。我需要向其中传递一个类名,而不仅仅是一个类型,但我只知道在运行时根据上面的反射方法的类型。我找到了一篇文章,详细说明了如果我只是将泛型类型传递到一个方法中,如何使这项工作,他解释了使用Activator.CreateIn的问题但是我似乎知道我想放在那里的类型——我只是在它运行之前不知道它(我通过反射检索它)

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


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

简而言之,泛型在运行时不是泛型的,在编译时,“Thing”变成了“Thing”的具体静态类型或者不管你创建了什么样的实例。所以你不能在运行时这样做,这不是泛型的意义所在。你可以潜在地生成一个新类型并动态加载它,但我不知道这是否可能,甚至没有意义,如果你有一个对象而你不知道它的类型,这可能会把事情弄清楚,这才是真正的问题所在解决。如果您在运行时发现某个对象是什么类型的,那么您将如何处理该对象?将其传递给另一个方法或在运行时对其执行其他操作需要编写可编译的代码。但是,当您不知道该对象是什么时,如何编写或编译代码?这不是一个不可能的问题,但我建议您执行以下操作:任何事情你都可以避免它,因为解决方案将是脆弱而复杂的。如果我们的代码知道它对其他任何东西的操作类型,那么它将变得更简单。另一种说法是:如果你使用泛型,它将变得复杂,反射看起来像是一个可能的答案,那么你就站在了问题的边缘。最好的办法是后退一步nd尝试以完全不同的方式解决原始问题。@ScottHannen最终,我知道类型是什么,因为调用者知道,我的目标是在这里使用泛型,这样我就可以避免生成特定于类型的解决方案。相反,我只想遍历提供的类型,并按原语类型运行,并针对复杂类型递归运行类型来检索和映射这些属性,但这需要将当前属性的类型传递到泛型类型中。例如:
typeof(ConversionTool).MakeGenericType([typeobject]).GetConstructor().Invoke(null);