2011-04-06 61 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)的方法。

相關問題