是在IL中标准化的属性getter /setter的方法命名

本文关键字:setter 方法 属性 IL 标准化 是在 getter | 更新日期: 2023-09-27 18:14:58

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

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?

是在IL中标准化的属性getter /setter的方法命名

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

  1. 它们总是以get_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);
}

您可以尝试以下操作:

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

你可以选择指定GetProperties的绑定标志