我有一个Control
参数的方法。我想得到控件的价值。因此,如果它是TextBox
获取Text
属性的值;如果它是NumericUpDown
获取Value
属性的值,依此类推。
问题是我不能写这样的东西:
Method(Control control)
{
control.Text;
}
或
Method(Control control)
{
control.Value;
}
因为不能保证控件具有这些属性之一,如果它具有它,它的名称是什么。 有没有办法做这样的事情?
答案 0 :(得分:3)
Value
课程中没有这样的常见Control
属性。
您应该使用一些if / else或switch / case或字典方法从控件中获取值。因为你知道你需要什么属性。控件只提供属性。
例如对于ComboBox
,值是多少?是SelectedItem
,SelectedIndex
,SelectedValue
,Text
吗?它的用法/意见基础。
最接近你要找的东西,就是依靠控件的DefaultProperty
属性来使用relfection从该属性中获取值。例如,使用此方法:
public object GetDefaultPropertyValue(Control c)
{
var defaultPropertyAttribute = c.GetType().GetCustomAttributes(true)
.OfType<DefaultPropertyAttribute>().FirstOrDefault();
var defaultProperty = defaultPropertyAttribute.Name;
return c.GetType().GetProperty(defaultProperty).GetValue(c);
}
你可以通过这种方式获得价值:
var controls = new List<Control> {
new Button() { Text = "button1" },
new NumericUpDown() { Value = 5 },
new TextBox() { Text = "some text" },
new CheckBox() { Checked = true }
};
var values = controls.Select(x => GetDefaultPropertyValue(x)).ToList();