IL中标准的属性getter / setter的方法是否标准化?

时间:2013-05-23 16:05:41

标签: c# properties naming-conventions .net-4.5 method-names

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

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?

2 个答案:

答案 0 :(得分:14)

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

  1. 它们始终以get_set_开头,而普通方法CAN则以这些前缀开头。
  2. 属性MethodInfo.IsSpecialName设置为true。
  3. MethodInfo具有自定义属性System.Runtime.CompilerServices.CompilerGeneratedAttribute
  4. 您可以选择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);
    }
    

答案 1 :(得分:1)

您可以尝试以下方法:

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

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