C# 反射-如何判断MethodInfo对象是方法还是属性访问器?

C# 反射-如何判断MethodInfo对象是方法还是属性访问器?,c#,reflection,C#,Reflection,我有两个相似(不完全相同)的DLL,其中一个实际上是另一个的一部分。我试图看看是否仍然有兼容性(也就是说,如果较小的仍然完全包含在较大的中) 我通过迭代较小的dll中的所有类型,并检查它们中的每个方法是否也存在于较大的dll中(名称和参数列表) 问题是Assembly.GetMethods()同时返回方法和属性getter/setters,我想这是一种方法,但在这种情况下这对我不好 因此,我的问题是,如何判断MethodInfo对象存储的是属性还是实方法?尝试以下方法 methodInfo.Is

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

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

问题是Assembly.GetMethods()同时返回方法和属性getter/setters,我想这是一种方法,但在这种情况下这对我不好

因此,我的问题是,如何判断MethodInfo对象存储的是属性还是实方法?

尝试以下方法

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

没有尝试,但这应该有帮助:

var isMethod = (yourMethodInfo.MemberType & MemberTypes.Method) == MemberTypes.Method;
更多信息:属性访问器是一种方法。属性只是get/set访问器的语法简写

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
循环。

编译器将属性访问器标记为
specialname
。您可以使用检查,您可以在
MethodInfo
对象上检查。此属性也适用于其他特殊方法,例如运算符重载

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

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

@RajeshSubramanian为什么你的建议会有帮助?我不是说你只是随便猜测,我是说我不明白你为什么要建议他们。是的,它检测属性访问器,但是属性访问器不是唯一被标记为特殊名称的方法,所以它会给出假阳性。+ 1用于制定第二个建议,尽管我会考虑调用<代码> GETGET方法。(非公开:true)同样适用于setter和
GetMethods
/
GetProperties
调用本身。您的第一个解决方案对我来说非常有效,因为我只需要“纯”方法,所以我必须排除其他一切。我真的非常感谢你,先生!:我看起来像是被愚弄了?@AakashM:看起来确实如此,不幸的是,我以前没有发现,而且有点匆忙,谢谢你指出。在这种情况下,我有什么需要做的吗?谢谢你的快速回答。我已经试过几次了MemberTypes,似乎所有这些都被视为methodInfo.MemberType==MemberTypes.Method。我想这是因为它们是隐式属性…是的,刚刚得到。感谢你澄清。我昨天已经开始反思了,今天就要交了,所以我们很忙。干杯。