Angi objektegenskap ved hjelp av refleksjon

 C Programming >> C C# Program >  >> C#
Angi objektegenskap ved hjelp av refleksjon

Ja, du kan bruke Type.InvokeMember() :

using System.Reflection;
MyObject obj = new MyObject();
obj.GetType().InvokeMember("Name",
    BindingFlags.Instance | BindingFlags.Public | BindingFlags.SetProperty,
    Type.DefaultBinder, obj, "Value");

Dette vil gi et unntak hvis obj har ikke en egenskap kalt Name , eller det kan ikke stilles inn.

En annen tilnærming er å hente metadata for eiendommen, og deretter sette den. Dette vil tillate deg å sjekke eksistensen av eiendommen, og bekrefte at den kan angis:

using System.Reflection;
MyObject obj = new MyObject();
PropertyInfo prop = obj.GetType().GetProperty("Name", BindingFlags.Public | BindingFlags.Instance);
if(null != prop && prop.CanWrite)
{
    prop.SetValue(obj, "Value", null);
}

Du kan også gjøre:

Type type = target.GetType();

PropertyInfo prop = type.GetProperty("propertyName");

prop.SetValue (target, propertyValue, null);

der target er objektet som skal ha egenskapen satt.


Refleksjon, i utgangspunktet, dvs.

myObject.GetType().GetProperty(property).SetValue(myObject, "Bob", null);

eller det er biblioteker for å hjelpe både når det gjelder bekvemmelighet og ytelse; for eksempel med FastMember:

var wrapped = ObjectAccessor.Create(obj); 
wrapped[property] = "Bob";

(som også har fordelen av at du ikke trenger å vite på forhånd om det er et felt kontra en eiendom)