是否可以从字符串中获取类的属性然后设置一个值?
例子:
string s = "label1.text";
string value = "new value";
label1.text = value; <--and some code that makes this
这该怎么做?
是否可以从字符串中获取类的属性然后设置一个值?
例子:
string s = "label1.text";
string value = "new value";
label1.text = value; <--and some code that makes this
这该怎么做?
你可以使用反射来做到这一点,但它会很慢?
也许如果你告诉我们你想通过这样做来实现什么,我们可以提供帮助,事件处理程序等上有几种模式通常使这变得不必要。
基于这个来源,相当于
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
答案是使用反射。但是,有许多应用程序框架使该过程变得更加容易。
例如,看看Spring.Net Expressions。它允许您执行以下操作:
ExpressionEvaluator.SetValue(object, "label1", "text");
它比这个简单的例子更强大、更灵活,所以看看吧。
您需要一个要设置其属性的对象的实例。从你的例子我会假装它是一个标签。
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);
}
}
如果给定控件是窗体上的实例变量(如果您使用内置的 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");
注意方法的范围。它是表单内的任何控件,但不是表单本身(访问表单本身,设置control
为this
)。
请注意,这会使用反射,并且会变得缓慢而脆弱(更改控件的名称会中断)。
我找到了这段代码:
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.