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

m-y*_*m-y 9 c# properties naming-conventions method-names .net-4.5

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

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);
}
Run Code Online (Sandbox Code Playgroud)

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

Mar*_*der 14

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

  1. 它们始终以get_或开始set_,而正常方法CAN从这些前缀开始.
  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);
}
Run Code Online (Sandbox Code Playgroud)