1

是否可以从字符串中获取类的属性然后设置一个值?

例子:

string s = "label1.text";
string value = "new value";

label1.text = value; <--and some code that makes this

这该怎么做?

4

6 回答 6

4

你可以使用反射来做到这一点,但它会很慢?

也许如果你告诉我们你想通过这样做来实现什么,我们可以提供帮助,事件处理程序等上有几种模式通常使这变得不必要。

于 2009-11-14T00:06:29.837 回答
4

基于这个来源,相当于

shipment.<propName> = valueToUse,

其中 'propName' 是以字符串形式提供的属性名称:

using System;
using System.Reflection;

namespace PropertyViaString
{
    public class Shipment
    {
        public string Sender { get; set; }
    }
    class Program
    {
        static void Main(string[] args)
        {
            Shipment shipment = new Shipment();
            SetValueExample(shipment, "Sender", "Popeye");
            Console.WriteLine("Sender is {0}", shipment.Sender);
            Console.ReadKey();
        }

        static void  SetValueExample(Shipment shipment, string propName, string valueToUse)
        {
            Type type = shipment.GetType();
            PropertyInfo senderProperty = type.GetProperty(propName);
            senderProperty.SetValue(shipment, valueToUse, null);
        }

    }
}

印刷

Sender is Popeye
于 2009-11-14T00:21:01.093 回答
2

答案是使用反射。但是,有许多应用程序框架使该过程变得更加容易。

例如,看看Spring.Net Expressions。它允许您执行以下操作:

ExpressionEvaluator.SetValue(object, "label1", "text");

它比这个简单的例子更强大、更灵活,所以看看吧。

于 2009-11-14T00:37:35.367 回答
1

您需要一个要设置其属性的对象的实例。从你的例子我会假装它是一个标签。

Label myLabel = new Label();
string s = "text";
string value = "new value";
System.Reflection.PropertyInfo[] properties = myLabel.GetType().GetProperties();
foreach (System.Reflection.PropertyInfo p in properties) 
{
    if(p.Name == s)
    {
         p.SetValue(myLabel, value, null);
    }
}
于 2009-11-14T00:20:01.003 回答
1

如果给定控件是窗体上的实例变量(如果您使用内置的 WinForms 设计器,大多数都是),首先获取控件,然后在其上设置属性:

    void Form_SetControlProperty(
        String controlName, String propertyName, object value)
    {
        FieldInfo controlField = this.GetType().GetField(controlName, 
            BindingFlags.Instance | BindingFlags.NonPublic | BindingFlags.Public);
        object control = controlField.GetValue(this);
        PropertyInfo property = control.GetType().GetProperty(propertyName);
        property.SetValue(control, value, new object[0]);
    }

您可能需要进行调整BindingFlags才能使其正常工作。

这必须是您表单上的一个方法。将其称为:SetControlProperty("myLabel", "Text", "my label text");

注意方法的范围。它是表单内的任何控件,但不是表单本身(访问表单本身,设置controlthis)。

请注意,这会使用反射,并且会变得缓慢而脆弱(更改控件的名称会中断)。

于 2009-11-14T10:40:00.157 回答
0

我找到了这段代码:

Object someObject = myForm; <--- want to make this Object someObject = "myForm";
String propName = "Title";
System.Reflection.PropertyInfo pi = someObject.GetType().GetProperty(propName);
pi.SetValue(someObject, "New Value", new Object[0]);

有用。但是该怎么做,可以将 someObject 设置为字符串。

Object someObject = (object)"myForm" <-- this doesn't work.
于 2009-11-14T10:07:21.167 回答