2012-02-06 2 views
5

私は別々のコードで、クラスが(リフレクションを使用して)性質を持っているかどうかを確認するための最良の方法は何である

public class Car 
{ 
     public string Name {get;set;} 
     public int Year {get;set;} 
} 

クラスを持っているが、私は(文字列として、フィールド名を持って使用してみましょう"Year")を例に挙げます。

私は車のオブジェクトの年フィールドがあるかどう把握でしょう。この

if (Car.HasProperty("Year")) 

のような何かをしたいです。これは真実を返すでしょう。

if (Car.HasProperty("Model")) 

はfalseを返します。

プロパティをループするコードがありますが、単一のフィールドが存在するかどうかを判断するためのより簡潔な方法があるかどうかを確認したいと考えました。

+4

'HasProperty'はより良いメソッド名ですか? –

答えて

15

この拡張メソッドはそれを行う必要があります。

static public bool HasProperty(this Type type, string name) 
{ 
    return type 
     .GetProperties(BindingFlags.Public | BindingFlags.Instance) 
     .Any(p => p.Name == name); 
} 

あなたは非インスタンスのプロパティ、プライベートプロパティ、または他のオプションをチェックしたい場合は、その文でBindingFlags値を微調整することができます。あなたの使用法の構文は、あなたが与えるものとまったく同じではありません。代わりに:

if (typeof(Car).HasProperty("Year")) 
8

だけpublicプロパティを探しているように見えるので、Type.GetProperty()は仕事をすることができます。

if (typeof(Car).GetProperty("Year") != null) { 
    // The 'Car' type exposes a public 'Year' property. 
} 

あなたは上記の抽象コードを促進したい場合は、あなたがType classに拡張メソッドを書くことができます。

public static bool HasPublicProperty(this Type type, string name) 
{ 
    return type.GetProperty(name) != null; 
} 

次に、このようにそれを使用します。

if (typeof(Car).HasPublicProperty("Year")) { 
    // The 'Car' type exposes a public 'Year' property. 
} 

また、非publicプロパティの存在を確認したい場合は、BindingFlags引数を取るType.GetProperties()のオーバーライドを呼び出して、その答えにDavid Mが結果をフィルタリングする必要があります。

関連する問題