Ich versuche zu wissen, ob eine Eigenschaft in einer Klasse vorhanden ist. 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);
}
c#
.net
reflection
Kris-I
quelle
quelle
MyClass
?Antworten:
Ihre Methode sieht folgendermaßen aus:
public static bool HasProperty(this object obj, string propertyName) { return obj.GetType().GetProperty(propertyName) != null; }
Dies fügt eine Erweiterung hinzu
object
- die Basisklasse von allem . Wenn Sie diese Nebenstelle aufrufen, übergeben Sie sieType
:var res = typeof(MyClass).HasProperty("Label");
Ihre Methode erwartet eine Instanz einer Klasse, keine
Type
. Ansonsten machst du im Wesentlichentypeof(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 richtig hervorhebt, sucht Ihr Code an dieser Stelle nach einer Eigenschaft
Label
fürSystem.Type
. Diese Eigenschaft existiert nicht.Die Lösung ist entweder
a) Stellen Sie der Erweiterung eine Instanz von MyClass bereit:
var myInstance = new MyClass() myInstance.HasProperty("Label")
b) Setzen Sie die Verlängerung auf
System.Type
public static bool HasProperty(this Type obj, string propertyName) { return obj.GetProperty(propertyName) != null; }
und
typeof(MyClass).HasProperty("Label");
quelle
, not
MyClass.Label".Dies beantwortet eine andere Frage:
Wenn Sie herausfinden möchten, ob ein OBJEKT (keine 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 (boolesch) wahr war.
@if ((Model.GetType().GetProperty("AddTimeoffBlackouts") == null) || Model.AddTimeoffBlackouts)
hat mir hier geholfen.
Bearbeiten: Heutzutage ist es wahrscheinlich klug, den
nameof
Operator anstelle des String-Eigenschaftsnamens zu verwenden.quelle
nameof
Operators (ohne Ausnahme), den Namen einer Eigenschaft abzurufen, die möglicherweise nicht vorhanden ist? Da die Prämisse der ursprünglichen Frage lautete, dass wir nicht wissen, ob diese Eigenschaft existiert?Es gibt 2 Möglichkeiten.
Sie haben wirklich kein
Label
Eigentum.Sie müssen die entsprechende GetProperty-Überladung aufrufen und die richtigen Bindungsflags übergeben, z
BindingFlags.Public | BindingFlags.Instance
Wenn Ihre Immobilie nicht öffentlich ist, müssen Sie eine
BindingFlags.NonPublic
andere Kombination von Flags verwenden, die zu Ihrem Anwendungsfall passt. Lesen Sie die referenzierten API-Dokumente, um die Details zu finden.BEARBEITEN:
Ooops, nur bemerkt , dass Sie rufen
GetProperty
auftypeof(MyClass)
.typeof(MyClass)
istType
was sicher keinLabel
eigentum hat.quelle
Instance|Public|Static
iirc.Label
ist das Privateigentum.Ich habe folgende Fehlermeldung erhalten: "Typ enthält keine Definition für GetProperty" beim Verknüpfen der akzeptierten Antwort.
Das ist, was ich am Ende hatte:
using System.Reflection; if (productModel.GetType().GetTypeInfo().GetDeclaredProperty(propertyName) != null) { }
quelle
Wenn Sie so verbindlich sind wie ich:
<%# Container.DataItem.GetType().GetProperty("Property1") != null ? DataBinder.Eval(Container.DataItem, "Property1") : DataBinder.Eval(Container.DataItem, "Property2") %>
quelle
Ich bin mir nicht sicher, warum dies erforderlich war. Daher werden möglicherweise nicht genügend Informationen für Sie zurückgegeben, aber ich konnte Folgendes tun:
if(typeof(ModelName).GetProperty("Name of Property") != null) { //whatevver you were wanting to do. }
In meinem Fall durchlaufe ich Eigenschaften aus einer Formularübermittlung und habe auch Standardwerte zu verwenden, wenn der Eintrag leer gelassen wird. Daher musste ich wissen, ob ein Wert zu verwenden war. Ich habe allen meinen Standardwerten im Modell ein Präfix vorangestellt Mit Standard musste ich also nur überprüfen, ob es eine Eigenschaft gab, die damit begann.
quelle