だから私の場合、私はリフレクションを使ってクラスの構造の発見をしています。プロパティがPropertyInfoオブジェクトによって自動実装されたプロパティであるかどうかを確認できる必要があります。自動プロパティはC#に依存しているため、リフレクションAPIはそのような機能を公開しないと思いますが、この情報を取得するための回避策はありますか?
5573 次
2 に答える
25
get
orメソッドが属性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 に答える