2010-09-24 99 views
7

想象型像這樣(C#):如何獲得封閉泛型的通用方法,從開放泛型類型打開MethodInfo?

public interface IAmGeneric<T> 
{ 
    void SoAmI<T1>(T one, T1 two); 
} 

鑑於我從類型(IAmGeneric<>.SoAmI<>())的開放通用版和下面的陣列開放式泛型MethodInfo

new[] { typeof(int), typeof(string) }' 

我找好表演和可靠的方式獲得這樣的MethodInfo關閉版本:

IAmGeneric<int>.SoAmI<string>() 

更新:

通過可靠我的意思是應該處理案件時,方法是不公開的,有十幾載,使用通用的參數從基本類型,而不僅僅是它的直接接口等

+0

如果你已經從接口'MethodInfo',你爲什麼要關心從基本型重載和通用參數? @DarrenKopp的解決方案就是您所需要的。 – 2012-11-13 02:56:38

回答

1

喜歡的東西呢?不知道你是尋找什麼,或許擴大你的問題......這肯定會需要增加了一些檢查(如檢查,如果聲明類型爲通用/如果方法是通用的,等等)

var method = typeof(IAmGeneric<>).GetMethod("SoAmI"); 
var types = new[] { typeof(int), typeof(string) }; 


var methodTypeParams = method.GetGenericArguments(); 
var fullType = method.DeclaringType.MakeGenericType(types.Take(types.Length - methodTypeParams.Length).ToArray()); 
var fullMethod = fullType.GetMethod(method.Name).MakeGenericMethod(types.Skip(types.Length - methodTypeParams.Length).ToArray()); 
1

這裏是一個情況下這是非常複雜的,以得到正確的:

public interface IAmGeneric<T> 
{ 
    void SoAmI<T1, T2>(T one, T1 two, T2 three); 
    void SoAmI<T1, T2>(T one, T2 two, T1 three); 
    void SoAmI<T1, T2>(T1 one, T two, T2 three); 
    void SoAmI<T1, T2>(T2 one, T1 two, T three); 
    void SoAmI<T1, T2, T3>(T2 one, T1 two, T3 three); 
} 

對我來說,解決方案是使用GetMethods(...).Select()和比較方法的名稱,參數個數,類型和類型參數的計算,以找到合適的方法(基本上一切是部分該方法的簽名)。

+0

可以,那可能會起作用,這就是我現在正在做的。然而,這個表現遠非恆星,因此我在問是否有更好的方法 – 2010-09-25 02:55:07

0

使用MethodBase.GetMethodFromHandle,如this related answer指出:

var ty = typeof(IAmGeneric<>); 
var numTyParams = ty.GenericTypeArguments.Length; 
var mi = ... do something with ty to get generic def for SoAmI<> ... 
var parameters = new[] { typeof(int), typeof(string) }; 
var output = MethodBase.GetMethodFromHandle(mi.MethodHandle, ty.MakeGenericType(parameters.Take(numTyParams).ToArray()).TypeHandle).MakeGenericMethod(parameters.Skip(numTyParams).ToArray()); 
相關問題