将Type类转换为泛型参数

时间:2011-04-06 00:28:01

标签: c# generics types

假设我有一个功能

public void func1<T>();

另一个功能:

public void func2(Type type);

在func2中,我想用类型调用func1。我怎样才能“转换”这个类型以便它适合?

编辑: 我不认为这很重要,但func1不是我的功能。它是框架的一部分:

context.CreateObjectSet<T>()

3 个答案:

答案 0 :(得分:4)

您无法显式调用泛型函数,因为您在编译时不知道类型。您可以使用反射来调用func1并将type指定为通用参数。但是,我建议您更改方法的签名,以避免在可能的情况下使用反射。

以下是使用Reflections进行操作的示例:

    private static void Method1(Type type)
    {
        MethodInfo methodInfo = typeof(Program).GetMethod("Method2", BindingFlags.NonPublic | BindingFlags.Static);
        MethodInfo genericMethodInfo = methodInfo.MakeGenericMethod(type);
        genericMethodInfo.Invoke(null, null);
    }

    private static void Method2<T>()
    {
        Console.WriteLine(typeof(T).FullName);
    }

答案 1 :(得分:1)

你必须使用反射。

public void func2(Type type)
{
    // call func1<T>()
    var thisType = this.GetType();
    var method = thisType.GetMethod("func1", new Type[0]).MakeGenericMethod(type);
    method.Invoke(this, null);
}

答案 2 :(得分:0)

另一种选择当然是:你可以简单地走另一个方向,使Type版本成为“真正的”版本:

public T func1<T>() 
{
    func2(typeof(T));
}

public object func2(Type type)
{
    Console.WriteLine(type.FullName);
}

这类似于框架实现Enum.TryParse<TEnum>Enum.TryParseEnum的方式。通用TEnum变体的实现只是将其(通过typeof(TEnum))传递给非泛型(Type - )方法。