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