2010-11-22 5 views
29

申し訳ありませんが、System.TypeタイプとPropertyInfoタイプをドキュメントで検索していますが、必要なものが見つかりません。プロパティが仮想として宣言されているかどうか調べる

プロパティ(またはメソッドまたは他のメンバー)が宣言クラスにvirtualと宣言されているかどうかをどのようにして知ることができますか?

class Cat 
{ 
    public string Name { get; set; } 
    public virtual int Age { get; set; } 
} 

Ageプロパティがvirtualか宣言されたかどうかはどのように教えていますか?あなたはIsVirtualプロパティを使用することができ

答えて

49

技術
var isVirtual = typeof(Cat).GetProperty("Age").GetGetMethod().IsVirtual; 
+1

考えられるプロパティが書き込み専用の場合、これは失敗します。 – cdhowie

+0

答えに感謝します。 –

+1

@cdhowieはい、失敗します。私は私の例でエラーチェックをしなかった。 –

17

、プロパティは仮想ではありません - 彼らのアクセサです。これを試してみてください:

typeof(Cat).GetProperty("Age").GetAccessors()[0].IsVirtual 

あなたが望んでいた場合は、プロパティが仮想であるかどうかを判断するために、以下のような拡張メソッドを使用することができます。

public static bool? IsVirtual(this PropertyInfo self) 
{ 
    if (self == null) 
     throw new ArgumentNullException("self"); 

    bool? found = null; 

    foreach (MethodInfo method in self.GetAccessors()) { 
     if (found.HasValue) { 
      if (found.Value != method.IsVirtual) 
       return null; 
     } else { 
      found = method.IsVirtual; 
     } 
    } 

    return found; 
} 

それはnullを返し、どちらかのプロパティが(何のアクセサを持っていない場合これは決して起こらないはずです)、またはすべてのプロパティアクセサーが同じ仮想ステータスを持っていません。少なくとも1つは仮想で、1つは仮想ではありません。

+1

+1 'GetAccessors()'は明らかに優れています。 –

+0

私は問題を解決するために** LINQ **を使用しました: 'var isVirtual = prop.GetType()。GetProperties() .Xhere> x.GetAccessors()。Any(a => a.IsVirtual)); ' –

+0

@MichaelCeranskiアクセサーに矛盾する仮想属性がある場合、これは私のコードと同じことをしないことに注意してください。 – cdhowie

関連する問題