如何从另一个线程获取GUI控件的属性值

时间:2011-03-07 08:10:04

标签: c# winforms multithreading reflection backgroundworker

VS2005 / Framework 2.0 / VB.NET

我正在使用BackgroundWorker控件做一些更新模式进度表单(.ShowDialog())的长时间工作。

我已经设法从BW DoWork / ProgressChanged事件中 SET 主要表单属性值,甚至调用表单的方法(在Reflection对象http://www.switchonthecode.com/tutorials/csharp-tutorial-using-reflection-to-get-object-information的帮助下)。

我唯一不知道怎么做的是获取主窗体的控件的属性回到BW线程。

1 个答案:

答案 0 :(得分:2)

那么,Reflection API中的所有Set方法都有一个相应的Get方法,因此示例中的代码可能是:

MyObject myObjectInstance = new MyObject();
System.Reflection.FieldInfo[] fieldInfo = myObjectType.GetFields();
string strValue = string.Empty;
int intValue = 0;
object objValue = null;

foreach (System.Reflection.FieldInfo info in fieldInfo)
{
   switch (info.Name)
   {
      case "myStringField":
         strValue = (string)info.GetValue(myObjectInstance);
        break;
      case "myIntField":
        intValue = (int)info.GetValue(myObjectInstance);
        break;
     case "myObjectField":
        objValue = info.GetValue(myObjectInstance);
        break;
}

但是,如果你有很多属性,这是获取/设置单个值的低效方法,所以你可以使用GetField方法,如下所示:

myType = myObjectInstance.GetType();
strValue = (string)myType.GetField("myStringField").GetValue(myObjectInstance);
intValue = (int)myType.GetField("myIntField").GetValue(myObjectInstance);
objValue = myType.GetField("myObjectField").GetValue(myObjectInstance);

还有一件事,反射是一个很好的工具,但需要付出代价。您的代码可维护性较差(毕竟,您使用字符串作为字段名称)并且性能受到严重损害。我的底线是尽可能避免反射,所以请先尝试寻找替代解决方案。