我有两个相似(不完全相同)的dll,其中一个实际上是另一个的一部分。我试图看看是否仍然存在兼容性(即,如果较小的仍然完全包含在较大的内容中)。
我这样做是通过迭代较小dll中的所有类型并检查它们中的每个方法是否也存在(名称和参数列表)在较大的dll中。
问题是Assembly.GetMethods()返回两个方法和属性getters / setters ,我猜,是的,这是一种方法,但在这种情况下这对我不利。
所以,我的问题是,如何判断MethodInfo对象是存储属性还是真正的方法?
答案 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 enumeration和MethodInfo.MemberType property