it-swarm.com.de

Prüfen Sie, ob eine Eigenschaft in einer Klasse vorhanden ist

Ich versuche zu wissen, ob eine Eigenschaft in einer Klasse existiert. Ich habe folgendes versucht:

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

Ich verstehe nicht, warum die erste Testmethode nicht besteht?

[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);
}
62
Kris-I

Ihre Methode sieht so aus:

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

Dies fügt eine Erweiterung zu object hinzu - der Basisklasse von allem . Wenn Sie diese Erweiterung anrufen, übergeben Sie eine Type:

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

Ihre Methode erwartet eine Instanz einer Klasse, keine Type. Ansonsten machst du im Wesentlichen

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

Dann

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

Wie @PeterRitchie zu Recht darauf hinweist, sucht Ihr Code an dieser Stelle nach der Eigenschaft Label in System.Type. Diese Eigenschaft existiert nicht.

Die Lösung ist entweder

a) Stellen Sie der Erweiterung eine Instanz von MyClass zur Verfügung:

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

b) Setzen Sie die Erweiterung auf System.Type

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

und

typeof(MyClass).HasProperty("Label");
88
Jamiec

Dies beantwortet eine andere Frage:

Wenn Sie versuchen herauszufinden, ob ein OBJECT (nicht eine Klasse) eine Eigenschaft hat, 

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

gibt true zurück, wenn (aber nicht nur wenn) die Eigenschaft vorhanden ist.

In meinem Fall befand ich mich in einer ASP.NET MVC-Teilansicht und wollte etwas rendern, wenn entweder die Eigenschaft nicht vorhanden war oder die Eigenschaft (boolean) den Wert true hatte.

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

hat mir hier geholfen.

Edit: Heutzutage ist es wahrscheinlich klüger, den Operator nameof anstelle des stringified-Eigenschaftennamens zu verwenden.

16
Stachu

Es gibt 2 Möglichkeiten.

Sie haben wirklich keine Label-Eigenschaft.

Sie müssen die entsprechende GetProperty-Überladung aufrufen und die richtigen Bindungsflags übergeben, z. BindingFlags.Public | BindingFlags.Instance

Wenn Ihre Eigenschaft nicht öffentlich ist, müssen Sie BindingFlags.NonPublic oder eine andere Kombination von Flags verwenden, die zu Ihrem Anwendungsfall passt. Lesen Sie die referenzierten API-Dokumente, um die Details zu finden.

BEARBEITEN:

ooops, ich habe gerade bemerkt, dass Sie GetProperty bei typeof(MyClass) aufrufen. typeof(MyClass) ist Type, die sicherlich keine Label-Eigenschaft hat.

2

Ich habe folgende Fehlermeldung erhalten: "Typ enthält keine Definition für GetProperty", wenn die akzeptierte Antwort gebunden wird.

Dies ist, was ich endete mit:

using System.Reflection;

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

}
1
JedatKinports

Ich bin mir nicht sicher, in welchem ​​Kontext dies erforderlich war. Daher werden möglicherweise nicht genügend Informationen für Sie zurückgegeben. Dies ist jedoch der Fall, den ich tun konnte:

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

In meinem Fall durchlaufe ich Eigenschaften von einer Formularübergabe und habe auch Standardwerte, die zu verwenden sind, wenn der Eintrag leer bleibt. Daher musste ich wissen, ob ein Wert vorhanden war. Ich habe alle meine Standardwerte im Modell vorangestellt Mit Default brauchte ich nur zu prüfen, ob es eine Eigenschaft gab, die damit begann.

0
C Gil

Wenn Sie verbindlich sind wie ich war:

<%# Container.DataItem.GetType().GetProperty("Property1") != null ? DataBinder.Eval(Container.DataItem, "Property1") : DataBinder.Eval(Container.DataItem, "Property2")  %>
0
Ben