想象一下这样的类型(C#):
public interface IAmGeneric<T>
{
void SoAmI<T1>(T one, T1 two);
}
鉴于我已从类型(MethodInfo
)的开放通用版本和以下数组中打开通用IAmGeneric<>.SoAmI<>()
new[] { typeof(int), typeof(string) }'
我正在寻找表现良好且可靠的方法来获取MethodInfo
这样的封闭版本:
IAmGeneric<int>.SoAmI<string>()
更新:
可靠我的意思是它应该处理当方法不公开,有十几个重载,使用基类型的通用参数,而不仅仅是它的直接接口等的情况。
答案 0 :(得分: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 :(得分: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()
并比较方法名称,参数计数,类型和类型参数count来找到正确的方法(基本上是方法签名的一部分)。
答案 2 :(得分: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());