【问题标题】:How to find an overloaded method by reflection如何通过反射找到重载的方法
【发布时间】:2014-10-14 19:41:35
【问题描述】:

这是一个与another question I asked before 相关的问题。我有一个重载的方法:

public void Add<T>(SomeType<T> some) { }

public void Add<T>(AnotherType<T> another) { }

如何通过反射找到每种方法?例如如何通过反射获得Add&lt;T&gt;(SomeType&lt;T&gt; some) 方法?你能帮我吗?提前致谢。

【问题讨论】:

    标签: c# generics reflection methodinfo


    【解决方案1】:

    这里的技巧是描述您希望参数为SomeType&lt;T&gt;,其中TAdd 方法的泛型类型。

    除此之外,它只是使用标准反射,就像 CastroXXL 在他的回答中建议的那样。

    我是这样做的:

    var theMethodISeek = typeof(MyClass).GetMethods()
        .Where(m => m.Name == "Add" && m.IsGenericMethodDefinition)
        .Where(m =>
                {
                    // the generic T type
                    var typeT = m.GetGenericArguments()[0];
    
                    // SomeType<T>
                    var someTypeOfT = 
                        typeof(SomeType<>).MakeGenericType(new[] { typeT });
    
                    return m.GetParameters().First().ParameterType == someTypeOfT;
                })
        .First();
    

    【讨论】:

    • 对不起,还有一点。如何检测一个类型是否遵循泛型类型的约束?
    • 查看typeof(SomeType&lt;&gt;).GetGenericArguments().First().GetGenericParameterConstraints() 的调试器并查看Type.IsAssignableFrom 方法:msdn.microsoft.com/en-us/library/… 我认为将它们结合起来会得到你想要的
    【解决方案2】:

    查看 MethodInfo 成员:http://msdn.microsoft.com/en-US/library/system.reflection.methodinfo_members(v=vs.80).aspx

    IsGenericMethodDefinitionGetParameters 有一些辅助属性。两者都可以帮助您弄清楚什么是功能。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-07-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-05-25
      • 1970-01-01
      相关资源
      最近更新 更多