9

次の2つの方法があり、それらが適切かどうか疑問に思っています。

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 をチェックしてプログラムで命名規則を取得する部分は避けたいと考えています。基本的に、MethodInfo がプロパティのゲッター/セッターであるかどうかを確認できる .NET 4.5 クラスはありますか?

4

2 に答える 2

14

プロパティ メソッドには、通常のメソッドと比較して、次の 3 つの特徴があります。

  1. それらは常にget_orset_で始まりますが、通常のメソッドはこれらの接頭辞で始めることができます。
  2. プロパティMethodInfo.IsSpecialNameは true に設定されています。
  3. MethodInfo にはカスタム属性がありますSystem.Runtime.CompilerServices.CompilerGeneratedAttribute

オプション 2 または 3 と組み合わせて 1 をチェックできます。プレフィックスは標準であるため、それをチェックすることについてあまり心配する必要はありません。

もう 1 つの方法は、すべてのプロパティを列挙し、メソッドを一致させることです。これは非常に遅くなります。

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);
}
于 2013-05-23T16:25:50.133 に答える
1

次のことを試すことができます。

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

オプションで、GetProperties のバインディング フラグを指定できます。

于 2013-05-23T16:12:17.440 に答える