可以說我有一個功能CONVER Type類爲一般的參數
public void func1<T>();
而另一功能:
public void func2(Type type);
裏面FUNC2,我想打電話給FUNC1與類型。我怎樣才能「轉換」這種類型以適應?
編輯: 我沒想到會有問題,但func1不是我的功能。它是框架的一部分:
context.CreateObjectSet<T>()
可以說我有一個功能CONVER Type類爲一般的參數
public void func1<T>();
而另一功能:
public void func2(Type type);
裏面FUNC2,我想打電話給FUNC1與類型。我怎樣才能「轉換」這種類型以適應?
編輯: 我沒想到會有問題,但func1不是我的功能。它是框架的一部分:
context.CreateObjectSet<T>()
由於在編譯時不知道類型,所以不能顯式調用泛型函數。您可以使用反射來呼叫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);
}
你將不得不使用反射。
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);
}
另一種選擇,當然:你可以簡單地去另一個方向,使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
)的方法。
我編輯了我的問題,你能修改你的解決方案嗎? – 2011-04-06 07:34:18
你可以讓你的func2通用?如果沒有,那麼你就不能在沒有反射的情況下調用func1 - 你不知道在編譯時作爲泛型參數傳遞給func1的類型,泛型是在編譯時知道類型的。 – 2011-04-06 14:55:14