5

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

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

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

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

4

4 回答 4

11

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;
于 2012-06-06T08:19:29.420 回答
2

属性访问器一种方法。属性只不过是 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循环。

于 2012-06-06T08:16:10.037 回答
0

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

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

更多信息:MemberTypes 枚举MethodInfo.MemberType 属性

于 2012-06-06T08:13:38.763 回答
-1

试试下面的,

methodInfo.IsDefined(typeof(System.Runtime.CompilerServices.CompilerGeneratedAttribute), false);
methodinfo.MemberType == MemberTypes.Property
于 2012-06-06T08:12:02.757 回答