如何在c#中实现此方法:
public static void SetParam(string element, string property, dynamic value){
// Do something
}
// Usage:
setParam("textBox1","Text","Hello");
在JavaScript中看起来:
function SetParam(element, property, value) {
document.getElementById(element)[property]=value;
}
// Usage:
SetParam("textBox","value","Hello");
答案 0 :(得分:1)
如果我理解你的问题,可以在 Reflection 的帮助下完成...
首先在您的cs文件顶部添加:using System.Reflection;
。
因为我不知道你是使用WPF还是Winforms - 这里有2个例子......
WPF:
您可以使用此版本的SetParam:
private void SetParam(string name, string property, dynamic value)
{
// Find the object based on it's name
object target = this.FindName(name);
if (target != null)
{
// Find the correct property
Type type = target.GetType();
PropertyInfo prop = type.GetProperty(property);
// Change the value of the property
prop.SetValue(target, value);
}
}
用法:
private void Window_Loaded(object sender, RoutedEventArgs e)
{
SetParam("textbox", "Text", "Hello");
textbox
声明如下:
<TextBox x:Name="textbox" />
对于Winforms,只需将SetParam更改为:
private void SetParam(string name, string property, dynamic value)
{
// Find the object based on it's name
object target = this.Controls.Cast<Control>().FirstOrDefault(c => c.Name == name);
if (target != null)
{
// Find the correct property
Type type = target.GetType();
PropertyInfo prop = type.GetProperty(property);
// Change the value of the property
prop.SetValue(target, value);
}
}
答案 1 :(得分:1)
以下可能适合您。
public void SetParam(string element, string property, dynamic value)
{
FieldInfo field = typeof(Form1).GetField(element, BindingFlags.NonPublic | BindingFlags.Instance);
object control = field.GetValue(this);
control.GetType().GetProperty(property).SetValue(control, value, null);
}
将Form1
替换为包含您要修改的控件的表单类。
编辑:在阅读了Blachshma的回答后,我意识到你必须把
using System.Reflection;
位于文件顶部。
我还认为它适用于Windows窗体应用程序。
最后,获得对控件的引用的更好方法可能是使用像Greg建议的Form.Controls
属性。
答案 2 :(得分:0)
假设“element”变量是控件的I,然后使用反射:
PropertyInfo propertyInfo = form1.Controls.Where(c => c.id == element).FirstOrDefault().GetType().GetProperty(property,
BindingFlags.Instance | BindingFlags.Public | BindingFlags.IgnoreCase);
if (propertyInfo != null)
{
if (propertyInfo.PropertyType.Equals(value.GetType()))
propertyInfo.SetValue(control, value, null);
else
throw new Exception("Property DataType mismatch, expecting a " +
propertyInfo.PropertyType.ToString() + " and got a " +
value.GetType().ToString());
}
}