【发布时间】:2019-01-23 21:04:16
【问题描述】:
我有一个函数可以从各种窗口控件返回相关文本。
我希望能够创造一些更优雅、更少静态的东西。
这是我想要的功能的代码:
public string returnText(Control controller)
{
string bob = controller.GetType().Name.ToString();
if (bob == "TextBox")
return ((TextBox)controller).Text;
else if (bob == "ComboBox")
return ((ComboBox)controller).SelectedValue.ToString();
else
return "Invalid Object";
}
我想做的是这样的:
调用代码:
TextBoxValue del = x => x.Text;
ComboBoxValue com = x => x.SelectedValue.ToString();
bob.returnText2(this.cboUnitType, com);
bob.returnText2(this.txtCurbAdj, del);
功能:
public string returnText2<T>(T controller, Func<T, string> lambda )
{
return lambda(controller);
}
我猜我在一般方面做错了,但我一直无法找出正确的方法来做这件事。 或者也许我完全出去吃午饭了。
【问题讨论】:
-
您的返回值是否始终是控件的属性并始终返回字符串?如果是的话,你看过反射吗?
-
对于这个特定的函数,是的,返回类型将始终是字符串。我没有看反射,但我会检查文档。您认为有什么特别的地方可以在这里使用吗?
-
好的,您的代码看起来不错,那么,您的问题是什么?你有什么问题?
-
@VadimMartynov 我遇到了一个错误,指出我无法将 ComboBoxValue 转换为 System.Func
。我认为这意味着我做了一些不太干净的事情。 -
严格来说,您有一个对象应该公开一个名为
Text的属性,该属性返回一个string。这对我来说听起来像是一个界面。解决此问题的一种方法是创建这样的接口(例如IControlWithText),然后创建自己的派生TextBox和ComboBox类来实现它,然后使用它们来代替并使用接口类型传递它们。这显然可能是矫枉过正,这取决于你在做什么。