2010-09-24 92 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()); 
相关问题