Controleer of een eigenschap in een klasse bestaat

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 Labelop 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 nameofte 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.NonPublicof 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 GetPropertybelt op typeof(MyClass). typeof(MyClass)is Typewat zeker geen Labeleigenschap 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.

Other episodes