97

私はプロパティがクラスに存在するかどうかを知りたいのですが、これを試しました:

public static bool HasProperty(this object obj, string propertyName)
{
    return obj.GetType().GetProperty(propertyName) != null;
}

最初の試験方法が合格しない理由がわかりませんか?

[TestMethod]
public void Test_HasProperty_True()
{
    var res = typeof(MyClass).HasProperty("Label");
    Assert.IsTrue(res);
}

[TestMethod]
public void Test_HasProperty_False()
{
    var res = typeof(MyClass).HasProperty("Lab");
    Assert.IsFalse(res);
}
4

6 に答える 6

150

メソッドは次のようになります。

public static bool HasProperty(this object obj, string propertyName)
{
    return obj.GetType().GetProperty(propertyName) != null;
}

これにより、すべてobjectの基本クラスに拡張機能が追加されます。この拡張機能を呼び出すと、次のように渡されます。Type

var res = typeof(MyClass).HasProperty("Label");

メソッドは、ではなくクラスのインスタンスTypeを想定しています。そうでなければ、あなたは本質的にやっています

typeof(MyClass) - this gives an instanceof `System.Type`. 

それで

type.GetType() - this gives `System.Type`
Getproperty('xxx') - whatever you provide as xxx is unlikely to be on `System.Type`

@PeterRitchieが正しく指摘しているように、この時点で、コードはのプロパティを探していLabelますSystem.Type。そのプロパティは存在しません。

解決策はどちらかです

a)MyClassのインスタンスを拡張機能に提供します。

var myInstance = new MyClass()
myInstance.HasProperty("Label")

b)拡張機能を装着しますSystem.Type

public static bool HasProperty(this Type obj, string propertyName)
{
    return obj.GetProperty(propertyName) != null;
}

typeof(MyClass).HasProperty("Label");
于 2013-03-11T14:33:14.717 に答える
28

これは別の質問に答えます:

オブジェクト(クラスではない)にプロパティがあるかどうかを把握しようとすると、

OBJECT.GetType().GetProperty("PROPERTY") != null

プロパティが存在する場合(ただし、その場合だけではありません)、trueを返します。

私の場合、ASP.NET MVCパーシャルビューを使用していて、プロパティが存在しないか、プロパティ(ブール値)がtrueの場合に何かをレンダリングしたいと考えていました。

@if ((Model.GetType().GetProperty("AddTimeoffBlackouts") == null) ||
        Model.AddTimeoffBlackouts)

ここで私を助けてくれました。

nameof編集:最近では、文字列化されたプロパティ名の代わりに演算子を使用するのが賢明でしょう。

于 2013-12-18T15:00:16.807 に答える
3

受け入れられた回答を結ぶときに、「タイプにGetPropertyの定義が含まれていません」というエラーが発生しました。

これは私が最終的に得たものです:

using System.Reflection;

if (productModel.GetType().GetTypeInfo().GetDeclaredProperty(propertyName) != null)
{

}
于 2017-05-17T07:20:01.937 に答える
2

2つの可能性があります。

Labelあなたは本当に財産を持っていません。

適切なGetPropertyオーバーロードを呼び出して、正しいバインディングフラグを渡す必要があります。BindingFlags.Public | BindingFlags.Instance

プロパティが公開されていない場合はBindingFlags.NonPublic、ユースケースに適したフラグを使用するか、他の組み合わせを使用する必要があります。詳細については、参照されているAPIドキュメントをお読みください。

編集:

おっと、あなたがに電話をかけていることに気づきGetPropertyましたtypeof(MyClass)。確かにプロパティtypeof(MyClass)がないものです。TypeLabel

于 2013-03-11T14:29:13.353 に答える
0

あなたが私のように拘束しているなら:

<%# Container.DataItem.GetType().GetProperty("Property1") != null ? DataBinder.Eval(Container.DataItem, "Property1") : DataBinder.Eval(Container.DataItem, "Property2")  %>
于 2015-04-22T15:26:31.400 に答える
0

なぜこれが必要なのかについての文脈がわからないので、これはあなたに十分な情報を返さないかもしれませんが、これは私ができたことです:

if(typeof(ModelName).GetProperty("Name of Property") != null)
{
//whatevver you were wanting to do.
}

私の場合、フォーム送信からプロパティを実行していて、エントリが空白のままの場合に使用するデフォルト値もあります-したがって、使用する値があるかどうかを知る必要がありました-モデル内のすべてのデフォルト値にプレフィックスを付けましたDefaultを使用しているので、それで始まるプロパティがあったかどうかを確認するだけです。

于 2018-04-09T12:36:47.060 に答える