我有两个相似(不相同)的 dll,其中一个实际上是另一个的一部分。我正在尝试查看是否仍然存在兼容性(即,较小的是否仍然完全包含在较大的中)。
我通过迭代较小的 dll 中的所有类型并检查其中的每个方法是否也存在于较大的 dll 中(名称和参数列表)来做到这一点。
问题是 Assembly.GetMethods() 返回方法和属性 getters/setters,我猜,是的,是一种方法,但在这种情况下这对我不利。
所以,我的问题是,如何判断 MethodInfo 对象是存储属性还是真实方法?
我有两个相似(不相同)的 dll,其中一个实际上是另一个的一部分。我正在尝试查看是否仍然存在兼容性(即,较小的是否仍然完全包含在较大的中)。
我通过迭代较小的 dll 中的所有类型并检查其中的每个方法是否也存在于较大的 dll 中(名称和参数列表)来做到这一点。
问题是 Assembly.GetMethods() 返回方法和属性 getters/setters,我猜,是的,是一种方法,但在这种情况下这对我不利。
所以,我的问题是,如何判断 MethodInfo 对象是存储属性还是真实方法?
specialname属性访问器由编译器标记为。你可以用 来检查这个MethodBase.IsSpecialName,你可以检查你的MethodInfo对象。此属性也适用于其他特殊方法,例如运算符重载。
排除属性 getter 和 setter 的另一种可能性是这个查询:
from m in typeof(SomeType).GetMethods()
where !typeof(SomeType).GetProperties().Any(p => p.GetGetMethod() == m || p.GetSetMethod() == m)
select m;
属性访问器是一种方法。属性只不过是 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 }
}
如果您理解这一点,您可能会发现 aMethodInfo无法告诉您您正在寻找的答案。相反,您必须采取相反的路径:查看是否有任何属性(也可能还有事件)将该方法用作访问器。你可以使用Type.GetProperties()一个简单的foreach循环。
没有尝试,但这应该会有所帮助:
var isMethod = (yourMethodInfo.MemberType & MemberTypes.Method) == MemberTypes.Method;
试试下面的,
methodInfo.IsDefined(typeof(System.Runtime.CompilerServices.CompilerGeneratedAttribute), false);
methodinfo.MemberType == MemberTypes.Property