如何在C#中为Generic方法传递Dynamic Class类型

时间:2015-03-31 17:15:59

标签: c#

我有一个通用方法

JsonMapper.ToObject<>(jsonString);

但是在这里我想将Generic类型传递给我在String中的方法,那么如何将类型从String传递给这个方法泛型?

在java中我可以使用

Class.forName("");

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

2 个答案:

答案 0 :(得分:4)

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

坦率地说,我的建议是:不要设计这样的工具来使用通用API。使用基于非通用Type的API。你总是可以重新曝光它作为泛型:

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

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

可以完全相反 - 通过MakeGenericMethodInvoke - 但效率较低且灵活性较差。

要从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)