我有一个通用的方法如何通过动态类类型在C#泛型方法
JsonMapper.ToObject<>(jsonString);
,但在这里,我想通过泛型类型的方法,我有一个字符串,所以怎么能我从String传递类类型到这个方法泛型类型?
在java中我可以使用
Class.forName("");
,但在C#中我应该怎么做呢?
我有一个通用的方法如何通过动态类类型在C#泛型方法
JsonMapper.ToObject<>(jsonString);
,但在这里,我想通过泛型类型的方法,我有一个字符串,所以怎么能我从String传递类类型到这个方法泛型类型?
在java中我可以使用
Class.forName("");
,但在C#中我应该怎么做呢?
像这样的东西:
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)
即时对不起,X在这里是什么? – 2015-03-31 17:32:59
哪个'x'? LINQ表达式中的那个? – xanatos 2015-03-31 17:34:43
有混合反射和仿制药没有很好的方法;他们不是朋友。你可以使用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)
。
我不确定我是否正确理解你,但在泛型的c#中,你在任何泛型方法的'<>'位传递一个类型。 – mituw16 2015-03-31 17:20:54
@ mituw16的确如此,但您不会传递运行时类型实例。在这种情况下,它看起来像用户将有一个“类型”。 – 2015-03-31 17:24:13