2015-03-31 69 views
0

我有一个通用的方法如何通过动态类类型在C#泛型方法

JsonMapper.ToObject<>(jsonString); 

,但在这里,我想通过泛型类型的方法,我有一个字符串,所以怎么能我从String传递类类型到这个方法泛型类型?

在java中我可以使用

Class.forName(""); 

,但在C#中我应该怎么做呢?

+0

我不确定我是否正确理解你,但在泛型的c#中,你在任何泛型方法的'<>'位传递一个类型。 – mituw16 2015-03-31 17:20:54

+0

@ mituw16的确如此,但您不会传递运行时类型实例。在这种情况下,它看起来像用户将有一个“类型”。 – 2015-03-31 17:24:13

回答

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) 
+0

即时对不起,X在这里是什么? – 2015-03-31 17:32:59

+0

哪个'x'? LINQ表达式中的那个? – xanatos 2015-03-31 17:34:43

4

有混合反射和仿制药没有很好的方法;他们不是朋友。你可以使用MakeGenericMethod等,但是你手动做很多东西

坦率地说,我的建议是:不要设计这样的工具来使用通用API。使用非通用的基于Type的API。您可以随时重新暴露它作为仿制药:

public T Foo<T>(...) { return (T) Foo(typeof(T), ...); } 

public object Foo(Type type, ...) { 
    // the actual code 
} 

可以做完全相反 - 通过MakeGenericMethodInvoke - 但它是效率较低,不够灵活。

要从string获得Type,请参见Type.GetType(string)assembly.GetType(string)

相关问题