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

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

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?

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

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

您可以尝试以下方法:

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

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