2011-04-06 63 views
0

可以说我有一个功能CONVER Type类为一般的参数

public void func1<T>(); 

而另一功能:

public void func2(Type type); 

里面FUNC2,我想打电话给FUNC1与类型。我怎样才能“转换”这种类型以适应?

编辑: 我没想到会有问题,但func1不是我的功能。它是框架的一部分:

context.CreateObjectSet<T>() 

回答

4

由于在编译时不知道类型,所以不能显式调用泛型函数。您可以使用反射来呼叫func1并指定您的type作为一般参数。不过,如果可能的话,我建议您更改方法的签名以避免使用反射。

下面是如何与思考做一个例子:

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

我编辑了我的问题,你能修改你的解决方案吗? – 2011-04-06 07:34:18

+0

你可以让你的func2通用?如果没有,那么你就不能在没有反射的情况下调用func1 - 你不知道在编译时作为泛型参数传递给func1的类型,泛型是在编译时知道类型的。 – 2011-04-06 14:55:14

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); 
} 
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)的方法。

相关问题