一尘不染

使用反射设置对象属性

c#

在C#中,有什么方法可以使用反射来设置对象属性?

例如:

MyObject obj = new MyObject();
obj.Name = "Value";

我想开始obj.Name思考。就像是:

Reflection.SetProperty(obj, "Name") = "Value";

有办法吗?


阅读 443

收藏
2020-05-19

共1个答案

一尘不染

是的,您可以使用Type.InvokeMember()

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

如果obj没有名为的属性Name,或者无法设置,则会抛出异常。

另一种方法是获取属性的元数据,然后进行设置。这将允许您检查属性的存在,并验证是否可以设置:

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);
}
2020-05-19