27

だから私の場合、私はリフレクションを使ってクラスの構造の発見をしています。プロパティがPropertyInfoオブジェクトによって自動実装されたプロパティであるかどうかを確認できる必要があります。自動プロパティはC#に依存しているため、リフレクションAPIはそのような機能を公開しないと思いますが、この情報を取得するための回避策はありますか?

4

2 に答える 2

25

getorメソッドが属性setでマークされているかどうかを確認できます。次に、それをプロパティの名前と文字列を含む属性CompilerGeneratedでマークされたプライベートフィールドを探すことと組み合わせることができます。CompilerGenerated"BackingField"

多分:

public static bool MightBeCouldBeMaybeAutoGeneratedInstanceProperty(
    this PropertyInfo info
) {
    bool mightBe = info.GetGetMethod()
                       .GetCustomAttributes(
                           typeof(CompilerGeneratedAttribute),
                           true
                       )
                       .Any();
    if (!mightBe) {
        return false;
    }


    bool maybe = info.DeclaringType
                     .GetFields(BindingFlags.NonPublic | BindingFlags.Instance)
                     .Where(f => f.Name.Contains(info.Name))
                     .Where(f => f.Name.Contains("BackingField"))
                     .Where(
                         f => f.GetCustomAttributes(
                             typeof(CompilerGeneratedAttribute),
                             true
                         ).Any()
                     )
                     .Any();

        return maybe;
    }

それは絶対確実ではなく、非常に壊れやすく、おそらくMonoに移植することはできません。

于 2010-02-05T20:51:34.077 に答える
15

これは行う必要があります:

public static bool IsAutoProperty(this PropertyInfo prop)
{
    return prop.DeclaringType.GetFields(BindingFlags.NonPublic | BindingFlags.Instance)
                             .Any(f => f.Name.Contains("<" + prop.Name + ">"));
}

その理由は、自動Nameプロパティの場合、バッキングのプロパティは次のFieldInfoようになるためです。

<PropertName>k__BackingField

文字<>は通常のフィールドには表示されないため、そのような名前のフィールドは、自動プロパティのバッキングフィールドを指します。ジェイソンが言うように、そのもろい。

または、少し速くするために、

public static bool IsAutoProperty(this PropertyInfo prop)
{
    if (!prop.CanWrite || !prop.CanRead)
        return false;

    return prop.DeclaringType.GetFields(BindingFlags.NonPublic | BindingFlags.Instance)
                             .Any(f => f.Name.Contains("<" + prop.Name + ">"));
}
于 2013-05-12T11:07:20.583 に答える