通过字符串获取参数和元素

本文关键字:元素 参数 获取 字符串 | 更新日期: 2023-09-27 18:03:41

如何在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");

通过字符串获取参数和元素

也许下面的方法适合你。

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属性。

如果我正确理解你的问题,这可以通过Reflection

的一点帮助来完成。

首先在cs文件的顶部添加a: using System.Reflection;

由于我不知道你是使用WPF还是Winforms -这里有两个例子…
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);
      }
}

假设"element"变量是控件的I'd,然后使用反射:

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());
    }
}