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);
}
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");
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.
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.
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)
{
}
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.
Wenn Sie verbindlich sind wie ich war:
<%# Container.DataItem.GetType().GetProperty("Property1") != null ? DataBinder.Eval(Container.DataItem, "Property1") : DataBinder.Eval(Container.DataItem, "Property2") %>