System.Reflection - 如何判断MethodInfo对象是Method还是Property访问器?

时间:2012-06-06 08:08:14

标签: c# reflection

我有两个相似(不完全相同)的dll,其中一个实际上是另一个的一部分。我试图看看是否仍然存在兼容性(即,如果较小的仍然完全包含在较大的内容中)。

我这样做是通过迭代较小dll中的所有类型并检查它们中的每个方法是否也存在(名称和参数列表)在较大的dll中。

问题是Assembly.GetMethods()返回两个方法和属性getters / setters ,我猜,是的,这是一种方法,但在这种情况下这对我不利。

所以,我的问题是,如何判断MethodInfo对象是存储属性还是真正的方法?

4 个答案:

答案 0 :(得分:11)

编译器将属性访问器标记为specialname。您可以使用MethodBase.IsSpecialName进行检查,您可以在MethodInfo对象上查看该{{3}}。对于其他特殊方法(例如运算符重载),此属性也适用。

排除属性getter和setter的另一种可能性是这个查询:

from m in typeof(SomeType).GetMethods()
where !typeof(SomeType).GetProperties().Any(p => p.GetGetMethod() == m || p.GetSetMethod() == m)
select m;

答案 1 :(得分:2)

属性访问器方法。属性只不过是获取/设置访问器的语法简写。

class A
{
    public int P { get { return 0; } }
}
如果C#的定义不同,可以编写

class A
{
    public int get_P() { return 0; }
    public int P { get: get_P }
}

如果您了解这一点,您可能会发现MethodInfo无法告诉您正在寻找的答案。相反,您必须采取相反的路径:查看是否存在使用方法作为访问者的任何属性(也可能是事件)。您可以使用Type.GetProperties()和简单的foreach循环。

答案 2 :(得分:0)

尝试以下方法,

methodInfo.IsDefined(typeof(System.Runtime.CompilerServices.CompilerGeneratedAttribute), false);
methodinfo.MemberType == MemberTypes.Property

答案 3 :(得分:0)

没试过,但这应该有所帮助:

var isMethod = (yourMethodInfo.MemberType & MemberTypes.Method) == MemberTypes.Method;

有关此内容的更多信息:MemberTypes enumerationMethodInfo.MemberType property