[英]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.