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

C# 在C中从字符串设置对象属性#,c#,winforms,controls,properties,C#,Winforms,Controls,Properties,是否有任何方法可以从字符串设置对象的属性。例如,我将“FullRowSelect=true”和“HoverSelection=true”语句作为ListView属性的字符串 如何在不使用if-else或switch-case语句的情况下指定这些属性及其值?是否有任何SetProperty(propertyName,Value)方法或类似方法用于此操作?您可以使用反射来执行此操作,请查看PropertyInfo类的方法 您可以通过反射来实现这一点,看看PropertyInfo类的方法 没有这样的方

是否有任何方法可以从字符串设置对象的属性。例如,我将“FullRowSelect=true”和“HoverSelection=true”语句作为ListView属性的字符串


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

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


您可以通过反射来实现这一点,看看PropertyInfo类的方法


没有这样的方法,但是你可以用写一个。

没有这样的方法,但是你可以用写一个。

你可以看看。由于这一点,可以找到属性并设置其值。但是您需要自己解析字符串。从字符串中获取正确类型的有效值可能会有问题。

您可以查看。由于这一点,可以找到属性并设置其值。但是您需要自己解析字符串。从字符串中获取正确类型的有效值可能会有问题。

这可以通过反射实现,例如查看。

这可以通过反射实现,例如查看。

尝试以下操作:

private void setProperty(object containingObject, string propertyName, object newValue)
{
    containingObject.GetType().InvokeMember(propertyName, BindingFlags.SetProperty, null, containingObject, new object[] { newValue });
}
PropertyInfo pinfo = this.myListView.GetType().GetProperty("FullRowSelect");
if (pinfo != null)
    pinfo.SetValue(this.myListView, true, null);
试试这个:

private void setProperty(object containingObject, string propertyName, object newValue)
{
    containingObject.GetType().InvokeMember(propertyName, BindingFlags.SetProperty, null, containingObject, new object[] { newValue });
}
PropertyInfo pinfo = this.myListView.GetType().GetProperty("FullRowSelect");
if (pinfo != null)
    pinfo.SetValue(this.myListView, true, null);

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

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

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

myObj.GetType().GetProperty("FullRowSelect").SetValue(myObj, true, null);
试试这个:

private void setProperty(object containingObject, string propertyName, object newValue)
{
    containingObject.GetType().InvokeMember(propertyName, BindingFlags.SetProperty, null, containingObject, new object[] { newValue });
}
PropertyInfo pinfo = this.myListView.GetType().GetProperty("FullRowSelect");
if (pinfo != null)
    pinfo.SetValue(this.myListView, true, null);
试试这个:

private void setProperty(object containingObject, string propertyName, object newValue)
{
    containingObject.GetType().InvokeMember(propertyName, BindingFlags.SetProperty, null, containingObject, new object[] { newValue });
}
PropertyInfo pinfo = this.myListView.GetType().GetProperty("FullRowSelect");
if (pinfo != null)
    pinfo.SetValue(this.myListView, true, null);

第一种变体是使用反射:

    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;
        }
    }
公共类PropertyRapper
{
私有字典_getters=新字典();
公共财产说唱人()
{
foreach(typeof(T).GetProperties()中的变量项)
{
如果(!item.CanRead)
继续;
_Add(item.Name,item.getMethod());
}
}
公共字符串GetValue(T实例,字符串名称)
{
MethodBase吸气剂;
if(_getters.TryGetValue(name,out getter))
返回getter.Invoke(实例,null).ToString();
返回字符串。空;
}
}
要获取属性值,请执行以下操作:

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");
var wrapper=newpropertywrapper()//将其作为表单中的成员变量保存
var myObject=新的myObject{LastName=“Arne”);
var value=wrapper.GetValue(myObject,“LastName”);

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

第一种变体是使用反射:

    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;
        }
    }
公共类PropertyRapper
{
私有字典_getters=新字典();
公共财产说唱人()
{
foreach(typeof(T).GetProperties()中的变量项)
{
如果(!item.CanRead)
继续;
_Add(item.Name,item.getMethod());
}
}
公共字符串GetValue(T实例,字符串名称)
{
MethodBase吸气剂;
if(_getters.TryGetValue(name,out getter))
返回getter.Invoke(实例,null).ToString();
返回字符串。空;
}
}
要获取属性值,请执行以下操作:

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");
var wrapper=new PropertyWrapper();//将其作为表单中的成员变量保存
var myObject=新的myObject{LastName=“Arne”);
var value=wrapper.GetValue(myObject,“LastName”);
您还可以使用
Expression
类访问属性