我有一个通用方法
JsonMapper.ToObject<>(jsonString);
但是在这里我想将Generic类型传递给我在String中的方法,那么如何将类型从String传递给这个方法泛型?
在java中我可以使用
Class.forName("");
但是在C#中我应该怎么做?
答案 0 :(得分:4)
没有很好的混合反射和泛型的方法;他们不是朋友。你可以使用MakeGenericMethod
等,但是你手动很多东西。
坦率地说,我的建议是:不要设计这样的工具来使用通用API。使用基于非通用Type
的API。你总是可以重新曝光它作为泛型:
public T Foo<T>(...) { return (T) Foo(typeof(T), ...); }
public object Foo(Type type, ...) {
// the actual code
}
您可以完全相反 - 通过MakeGenericMethod
和Invoke
- 但效率较低且灵活性较差。
要从Type
获取string
,请参阅Type.GetType(string)
和assembly.GetType(string)
。
答案 1 :(得分:0)
有这样的事情:
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)