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)