[英]How to pass Dynamic Class type for a Generic method in C#
我有一个通用方法
JsonMapper.ToObject<>(jsonString);
但是在这里我想将Generic类型传递给String中的方法,那么如何将String中的类类型传递给此方法泛型呢?
在java中我可以使用
Class.forName("");
但是在C#中我应该怎么做?
没有什么好方法可以将反射和泛型混合使用。 他们不是朋友 。 您可以使用MakeGenericMethod
等,但是随后您需要手动做很多事情 。
坦白说,我的建议是:不要设计像这样的工具来使用通用API。 使用非通用Type
为基础的API。 您始终可以将其作为泛型重新公开 :
public T Foo<T>(...) { return (T) Foo(typeof(T), ...); }
public object Foo(Type type, ...) {
// the actual code
}
您可以通过MakeGenericMethod
和Invoke
进行完全相反的操作,但是效率较低且灵活性较低。
要从string
获取Type
,请参见Type.GetType(string)
和assembly.GetType(string)
。
用这样的东西:
MethodInfo method = (from x in typeof(JsonMapper).GetMethods(BindingFlags.Static | BindingFlags.Public)
where x.Name == "ToObject" && x.IsGenericMethodDefinition
let pars = x.GetParameters()
where pars.Length == 1 && pars[0].ParameterType == typeof(string)
select x).Single();
// Your generic type
Type type = Type.GetType("System.String");
MethodInfo method2 = method.MakeGenericMethod(type);
// Your input
string jsonString = "Hello";
object result = method2.Invoke(null, new object[] { jsonString });
如果ToObject<>
是static
并且具有如下签名:
public static T ToObject<T>(string input)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.