在C#中从字符串设置对象属性

时间:2010-12-20 11:27:20

标签: c# winforms controls properties

有没有办法从字符串设置对象的属性。例如,我将“FullRowSelect = true”和“HoverSelection = true”语句作为ListView属性的字符串。

如何在不使用if-else或switch-case语句的情况下分配这些属性及其值?是否有SetProperty(propertyName,Value)方法或类似方法?

8 个答案:

答案 0 :(得分:3)

试试这个:

private void setProperty(object containingObject, string propertyName, object newValue)
{
    containingObject.GetType().InvokeMember(propertyName, BindingFlags.SetProperty, null, containingObject, new object[] { newValue });
}

答案 1 :(得分:1)

您可以使用反射执行此操作,查看PropertyInfo类的SetValue方法

 YourClass theObject = this;
 PropertyInfo piInstance = typeof(YourClass).GetProperty("PropertyName");
 piInstance.SetValue(theObject, "Value", null);

答案 2 :(得分:1)

您可以使用反射来执行此操作:

myObj.GetType().GetProperty("FullRowSelect").SetValue(myObj, true, null);

答案 3 :(得分:1)

试试这个:

PropertyInfo pinfo = this.myListView.GetType().GetProperty("FullRowSelect");
if (pinfo != null)
    pinfo.SetValue(this.myListView, true, null);

答案 4 :(得分:0)

没有这样的方法,但您可以使用reflection编写一个方法。

答案 5 :(得分:0)

您可以查看Reflection。由此可以找到属性并设置其值。但是你需要自己解析你的字符串。并且可能是从字符串中确定正确类型的有效值的问题。

答案 6 :(得分:0)

这可以通过反思来完成,例如查看this question

答案 7 :(得分:0)

第一个变体是使用反射:

    public class PropertyWrapper<T>
    {
        private Dictionary<string, MethodBase> _getters = new Dictionary<string, MethodBase>();

        public PropertyWrapper()
        {
            foreach (var item in typeof(T).GetProperties())
            {
                if (!item.CanRead)
                    continue;

                _getters.Add(item.Name, item.GetGetMethod());
            }
        }

        public string GetValue(T instance, string name)
        {
            MethodBase getter;
            if (_getters.TryGetValue(name, out getter))
                return getter.Invoke(instance, null).ToString();

            return string.Empty;
        }
    }

获取属性值:

var wrapper = new PropertyWrapper<MyObject>(); //keep it as a member variable in your form

var myObject = new MyObject{LastName = "Arne");
var value = wrapper.GetValue(myObject, "LastName");

您还可以使用Expression类来访问属性。