【问题标题】:Is the method naming for property getters/setters standardized in IL?属性 getter/setter 的方法命名是否在 IL 中标准化?
【发布时间】:2013-05-26 03:52:54
【问题描述】:

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

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?

【问题讨论】:

  • 虽然我也会避免使用魔术字符串,但它们实际上是标准化的。

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


【解决方案1】:

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

  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);
}

【讨论】:

  • 很好的答案 - 我突然来添加类似的东西,但你已经涵盖了。
【解决方案2】:

您可以尝试以下方法:

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

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

【讨论】:

  • 现在,它只检查实例和公共属性。
  • @MartinMulder,抱歉,我没听懂你的评论?
  • @vc 74:如果方法所属的属性是私有或静态属性,您的代码将失败。
  • @MartinMulder,是的,因此我在帖子底部发表了评论
  • @vc 74:抱歉,没看过。另一方面:为什么不查询所有属性?为什么会有这么明显的遗漏?
猜你喜欢
  • 2012-09-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-05-29
  • 1970-01-01
  • 2023-03-25
  • 2012-01-25
相关资源
最近更新 更多