C#では、クラスがプロパティを持っているかどうかを調べる最良の方法は何ですか(リフレクションを使用して)

私にはクラスがあります

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

別のコードでは、私は例として文字列( "年"を使用)としてフィールド名を持っています。

私はこのようなことをしたい

   if (Car.HasProperty("Year")) 

carオブジェクトにYearフィールドがあるかどうかを調べます。これは真実を返すでしょう。

   if (Car.HasProperty("Model"))

falseを返します。

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

5
HasProperty はより良いメソッド名ではないでしょうか?
追加された 著者 David M,

2 答え

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

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"))
15
追加された

public のプロパティのみを探しているようだから、 Type.GetProperty()は仕事をすることができます:

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

上のコードをさらに抽象化したい場合は、 Typeクラスに拡張メソッドを記述できます。

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 引数をとり、David Mが答えたとおりに結果をフィルタリングする、Type.GetProperties()を使用します。

8
追加された