Ik probeer te weten of een eigenschap in een klasse bestaat, ik heb dit geprobeerd:
public static bool HasProperty(this object obj, string propertyName)
{
return obj.GetType().GetProperty(propertyName) != null;
}
Ik begrijp niet waarom de eerste testmethode niet slaagt?
[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);
}
Antwoord 1, autoriteit 100%
Uw methode ziet er als volgt uit:
public static bool HasProperty(this object obj, string propertyName)
{
return obj.GetType().GetProperty(propertyName) != null;
}
Dit voegt een extensie toe aan object
– de basisklasse van alles. Als je deze extensie aanroept, geef je hem een Type
:
var res = typeof(MyClass).HasProperty("Label");
Uw methode verwacht een instantievan een klasse, niet een Type
. Anders ben je eigenlijk aan het doen
typeof(MyClass) - this gives an instanceof `System.Type`.
Dan
type.GetType() - this gives `System.Type`
Getproperty('xxx') - whatever you provide as xxx is unlikely to be on `System.Type`
Zoals @PeterRitchie correct aangeeft, zoekt uw code op dit moment naar eigenschap Label
op System.Type
. Die eigenschap bestaat niet.
De oplossing is ofwel
a) Geef een exemplaarvan MyClass aan de extensie:
var myInstance = new MyClass()
myInstance.HasProperty("Label")
b) Zet de extensie op System.Type
public static bool HasProperty(this Type obj, string propertyName)
{
return obj.GetProperty(propertyName) != null;
}
en
typeof(MyClass).HasProperty("Label");
Antwoord 2, autoriteit 19%
Dit beantwoordt een andere vraag:
Als je probeert te achterhalen of een OBJECT (geen klasse) een eigenschap heeft,
OBJECT.GetType().GetProperty("PROPERTY") != null
retourneert true als (maar niet alleen als) de eigenschap bestaat.
In mijn geval zat ik in een ASP.NET MVC Partial View en wilde iets renderen als de eigenschap niet bestond of de eigenschap (boolean) waar was.
@if ((Model.GetType().GetProperty("AddTimeoffBlackouts") == null) ||
Model.AddTimeoffBlackouts)
heeft me hier geholpen.
Bewerken: Tegenwoordig is het waarschijnlijk slim om de operator nameof
te gebruiken in plaats van de stringified property name.
Antwoord 3, autoriteit 2%
Ik kreeg deze foutmelding: “Type bevat geen definitie voor GetProperty” bij het koppelen van het geaccepteerde antwoord.
Dit is waar ik mee eindigde:
using System.Reflection;
if (productModel.GetType().GetTypeInfo().GetDeclaredProperty(propertyName) != null)
{
}
Antwoord 4
Er zijn 2 mogelijkheden.
U heeft echt geen eigenschap Label
.
Je moet de juiste GetProperty overloadaanroepen en de juiste binding doorgeven vlaggen, bijv BindingFlags.Public | BindingFlags.Instance
Als uw eigendom niet openbaar is, moet u BindingFlags.NonPublic
of een andere combinatie van vlaggen gebruiken die past bij uw gebruiksscenario. Lees de API-documenten waarnaar wordt verwezen om de details te vinden.
BEWERKEN:
oeps, ik zie net dat je GetProperty
belt op typeof(MyClass)
. typeof(MyClass)
is Type
wat zeker geen Label
eigenschap heeft.
Antwoord 5
Als je bindend bent zoals ik was:
<%# Container.DataItem.GetType().GetProperty("Property1") != null ? DataBinder.Eval(Container.DataItem, "Property1") : DataBinder.Eval(Container.DataItem, "Property2") %>
Antwoord 6
Ik ben niet zeker van de context waarom dit nodig was, dus dit levert misschien niet genoeg informatie voor je op, maar dit is wat ik kon doen:
if(typeof(ModelName).GetProperty("Name of Property") != null)
{
//whatevver you were wanting to do.
}
In mijn geval doorloop ik eigenschappen van een formulierinzending en heb ik ook standaardwaarden om te gebruiken als de invoer leeg blijft – dus ik moest weten of er een waarde was om te gebruiken – ik heb al mijn standaardwaarden voorafgegaan door in het model met Standaard, dus ik hoefde alleen maar te controleren of er een eigenschap was die daarmee begon.