在c#中是否有一种方法,我可以使用反射来设置对象属性?

Ex:

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

我要设置obj。带有反射的名称。喜欢的东西:

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

有什么办法可以做到吗?


当前回答

我刚刚发布了一个Nuget包,它不仅允许设置第一级属性,还允许在给定对象中设置任意深度的嵌套属性。

这是包裹

根据对象从根开始的路径设置其属性的值。

对象可以是复杂对象,属性可以是多层深嵌套的属性,也可以是根目录下的直接属性。ObjectWriter将使用属性路径参数查找属性并更新其值。属性路径是从根到我们想设置的结束节点属性所访问的属性的附加名称,由分隔符字符串参数分隔。

用法:

直接在对象根目录下设置属性:

Ie。LineItem类有一个名为ItemId的int属性

LineItem lineItem = new LineItem();

ObjectWriter.Set(lineItem, "ItemId", 13, delimiter: null);

在对象根下面设置多层嵌套属性:

Ie。Invite类有一个名为State的属性,该属性有一个名为Invite (Invite类型)的属性,该属性有一个名为收件人的属性,该属性有一个名为Id的属性。

更复杂的是,State属性不是引用类型,而是结构体。

下面是如何在一行中设置对象树底部的Id属性(为“outlook”的字符串值)。

Invite invite = new Invite();

ObjectWriter.Set(invite, "State_Invite_Recipient_Id", "outlook", delimiter: "_");

其他回答

可以这样说:

public static class PropertyExtension{       

   public static void SetPropertyValue(this object p_object, string p_propertyName, object value)
   {
    PropertyInfo property = p_object.GetType().GetProperty(p_propertyName);
    property.SetValue(p_object, Convert.ChangeType(value, property.PropertyType), null);
   }
}

or

public static class PropertyExtension{       

   public static void SetPropertyValue(this object p_object, string p_propertyName, object value)
   {
    PropertyInfo property = p_object.GetType().GetProperty(p_propertyName);
    Type t = Nullable.GetUnderlyingType(property.PropertyType) ?? property.PropertyType;
    object safeValue = (value == null) ? null : Convert.ChangeType(value, t);

    property.SetValue(p_object, safeValue, null);
   }
}

当你想使用属性名从另一个对象批量分配一个对象的属性时,你可以尝试一下:

public static void Assign(this object destination, object source)
    {
        if (destination is IEnumerable && source is IEnumerable)
        {
            var dest_enumerator = (destination as IEnumerable).GetEnumerator();
            var src_enumerator = (source as IEnumerable).GetEnumerator();
            while (dest_enumerator.MoveNext() && src_enumerator.MoveNext())
                dest_enumerator.Current.Assign(src_enumerator.Current);
        }
        else
        {
            var destProperties = destination.GetType().GetProperties();
            foreach (var sourceProperty in source.GetType().GetProperties())
            {
                foreach (var destProperty in destProperties)
                {
                    if (destProperty.Name == sourceProperty.Name && destProperty.PropertyType.IsAssignableFrom(sourceProperty.PropertyType))
                    {
                        destProperty.SetValue(destination,     sourceProperty.GetValue(source, new object[] { }), new object[] { });
                        break;
            }
        }
    }
}

或者你可以在你自己的扩展类中包装Marc的一行代码:

public static class PropertyExtension{       

   public static void SetPropertyValue(this object obj, string propName, object value)
    {
        obj.GetType().GetProperty(propName).SetValue(obj, value, null);
    }
}

像这样叫它:

myObject.SetPropertyValue("myProperty", "myValue");

为了更好地衡量,让我们添加一个方法来获取属性值:

public static object GetPropertyValue(this object obj, string propName)
{
        return obj.GetType().GetProperty(propName).GetValue (obj, null);
}

我刚刚发布了一个Nuget包,它不仅允许设置第一级属性,还允许在给定对象中设置任意深度的嵌套属性。

这是包裹

根据对象从根开始的路径设置其属性的值。

对象可以是复杂对象,属性可以是多层深嵌套的属性,也可以是根目录下的直接属性。ObjectWriter将使用属性路径参数查找属性并更新其值。属性路径是从根到我们想设置的结束节点属性所访问的属性的附加名称,由分隔符字符串参数分隔。

用法:

直接在对象根目录下设置属性:

Ie。LineItem类有一个名为ItemId的int属性

LineItem lineItem = new LineItem();

ObjectWriter.Set(lineItem, "ItemId", 13, delimiter: null);

在对象根下面设置多层嵌套属性:

Ie。Invite类有一个名为State的属性,该属性有一个名为Invite (Invite类型)的属性,该属性有一个名为收件人的属性,该属性有一个名为Id的属性。

更复杂的是,State属性不是引用类型,而是结构体。

下面是如何在一行中设置对象树底部的Id属性(为“outlook”的字符串值)。

Invite invite = new Invite();

ObjectWriter.Set(invite, "State_Invite_Recipient_Id", "outlook", delimiter: "_");

是的,使用系统。反射:

using System.Reflection;

...

    string prop = "name";
    PropertyInfo pi = myObject.GetType().GetProperty(prop);
    pi.SetValue(myObject, "Bob", null);