查找具有不同名称的相同功能签名

时间:2018-08-14 14:36:20

标签: c# reflection

给出一个对象和一个实例方法,我想得到一个具有完全相同的签名但名称不同的方法。其中包括参数列表,通用参数,如果它们是签名的一部分,则可能包括属性。我该怎么办?

我知道GetMethod()存在,但我不知道哪个重载覆盖了所有可能的签名变化。

1 个答案:

答案 0 :(得分:2)

在某些情况下,这样的事情可能会起作用:

public static bool HasSameSignature(MethodInfo m1, MethodInfo m2)
{
  if (m1.GetGenericArguments().Length != m2.GetGenericArguments().Length)
    return false;

  var args1 = m1.GetParameters();
  var args2 = m2.GetParameters();
  if (args1.Length != args2.Length)
    return false;

  for (var idx = 0; idx < args1.Length; idx++)
  {
    if (!AreEquivalentTypes(args1[idx].ParameterType, args2[idx].ParameterType))
      return false;
  }
  return true;
}

static bool AreEquivalentTypes(Type t1, Type t2)
{
  if (t1 == null || t2 == null)
    return false;
  if (t1 == t2)
    return true;
  if (t1.DeclaringMethod != null && t2.DeclaringMethod != null && t1.GenericParameterPosition == t2.GenericParameterPosition)
    return true;
  if (AreEquivalentTypes(t1.GetElementType(), t2.GetElementType()))
    return true;
  if (t1.IsGenericType && t2.IsGenericType && t1.GetGenericTypeDefinition() == t2.GetGenericTypeDefinition())
  {
    var ta1 = t1.GenericTypeArguments;
    var ta2 = t2.GenericTypeArguments;
    for (var idx = 0; idx < ta1.Length; idx++)
    {
      if (!AreEquivalentTypes(ta1[idx], ta2[idx]))
        return false;
    }
    return true;
  }
  return false;
}

因此,给定您的一种方法,您可以对有问题的类型执行.GetMethods(),并找到名称正确的名称,以及在其上的HasSameSignature(...)和您给定的一种方法正确的类型。

Type givenType = ...;
MethodInfo givenMethod = ...;
string givenDifferentName = ...;

var answer = givenType.GetMethods()
  .SingleOrDefault(m => m.Name == givenDifferentName && HasSameSignature(m, givenMethod));