【问题标题】:Reflection: How to get a generic method? [duplicate]反思:如何获得泛型方法? [复制]
【发布时间】:2011-03-07 10:17:23
【问题描述】:

可能的重复:
How to use reflection to call generic Method?
Select Right Generic Method with Reflection

你好

假设我在一个类中有两个以下两个方法:

public void MyMethod(object val) {}
public void MyMethod<T>(T val) {}

通过反射,我可以得到这样的第一个方法:

Type[] typeArray = new Type[1];
typeArray.SetValue(typeof(object), 1);
var myMethod = myInstance.GetType().GetMethod("MyMethod", typeArray);

但是我怎样才能得到第二个通用方法呢?

【问题讨论】:

  • @AakashM:这不是该特定问题的重复。
  • 如果解决方案在代码方面很烦人,一个好的解决方法是在您自己的代码中拥有一个私有泛型方法,该方法调用您想要定位的泛型方法,然后使用反射调用它在这种情况下你可以逃脱:stackoverflow.com/a/232621/920

标签: c# reflection


【解决方案1】:
var myMethod = myInstance.GetType()
                         .GetMethods()
                         .Where(m => m.Name == "MyMethod")
                         .Select(m => new {
                                              Method = m,
                                              Params = m.GetParameters(),
                                              Args = m.GetGenericArguments()
                                          })
                         .Where(x => x.Params.Length == 1
                                     && x.Args.Length == 1
                                     && x.Params[0].ParameterType == x.Args[0])
                         .Select(x => x.Method)
                         .First();

【讨论】:

  • 谢谢 - 没想到会这么复杂 :-)
  • 哇,太烦人了
【解决方案2】:

我会这样做:

var methods = from m in typeof(MyClass).GetMethods()
              where m.Name == "MyMethod"
                 && m.IsGenericMethodDefinition

              let typeParams = m.GetGenericArguments()
              let normalParams = m.GetParameters()

              where typeParams.Length == 1 && normalParams.Length == 1
                 && typeParams.Single() == normalParams.Single().ParameterType
                 && !typeParams.Single().GetGenericParameterConstraints().Any()

              select m;

var myMethod = methods.Single();

我们正在寻找一种名为“MyMethod”的方法,它是一种通用方法,具有一个没有约束的类型参数和一个与类型参数相同类型的“普通”参数。

显然,如果您不想非常精确,您可以只做最低限度的消除歧义,例如:

var myMethod = typeof(MyClass)
              .GetMethods()
              .Single(m => m.Name == "MyMethod" && m.IsGenericMethodDefinition);

【讨论】:

  • thx - 第二个查询是一个很好的解决方法。但在可能的情况下,我宁愿保持精确,因为有更多的重载方法......
猜你喜欢
  • 1970-01-01
  • 2013-06-13
  • 2016-04-19
  • 1970-01-01
  • 1970-01-01
  • 2013-02-03
  • 1970-01-01
  • 1970-01-01
  • 2013-04-17
相关资源
最近更新 更多