9

我有以下两种方法,我想知道它们是否合适:

public bool IsGetter(MethodInfo method)
{
    return method.IsSpecialName
        && method.Name.StartsWith("get_", StringComparison.Ordinal);
}

public bool IsSetter(MethodInfo method)
{
    return method.IsSpecialName
        && method.Name.StartsWith("set_", StringComparison.Ordinal);
}

虽然此代码有效,但我希望避免检查 StartsWith 并以编程方式获取命名约定的部分。基本上,是否有任何 .NET 4.5 类能够查看 MethodInfo 是否是属性 getter/setter?

4

2 回答 2

14

与普通方法相比,属性方法具有三个额外的特性:

  1. 它们总是以get_or开头set_,而普通方法可以以这些前缀开头。
  2. 该属性MethodInfo.IsSpecialName设置为 true。
  3. MethodInfo 有一个自定义属性System.Runtime.CompilerServices.CompilerGeneratedAttribute

您可以检查 1,结合选项 2 或 3。由于前缀是标准,您不必担心检查它。

另一种方法是枚举所有属性并匹配方法,这会慢很多:

public bool IsGetter(MethodInfo method)
{
    if (!method.IsSpecialName)
        return false; // Easy and fast way out. 
    return method.DeclaringType
        .GetProperties(BindingFlags.Instance | BindingFlags.Static | BindingFlags.Public | BindingFlags.NonPublic) 
        .Any(p => p.GetGetMethod() == method);
}
于 2013-05-23T16:25:50.133 回答
1

您可以尝试以下方法:

public bool IsGetter(MethodInfo method)
{
    return method.DeclaringType.GetProperties().
                                Any(propInfo => propInfo.GetMethod == method);
}

您可以选择为 GetProperties 指定绑定标志

于 2013-05-23T16:12:17.440 回答