我有一个人类,需要获得“IsChecked”值。 ItemsSource可能有不同的类型,但所有类都有IsChecked属性。
public class Human{
public bool IsChecked{
get;
set;
}
}
private void CheckBoxLoaded(object sender, RoutedEventArgs e) //sender is CheckBox
//How set value from IsChecked?
var prop = t.GetType().GetProperties().Single(n => n.Name == "IsChecked");//I can access it by this method, but can't set value of sender which CheckBox;
}
答案 0 :(得分:1)
我假设您出于某种原因无法重构Human
类来实现包含ICheckable
的{{1}}接口,对吗?
如果您使用的是C#4.0,另一种方法是使用IsChecked
数据类型,这样您就可以设置仅在运行时检查的属性:
dynamic
如果所有其他方法都失败了,你真的必须使用反射,那么你就有90%的方式。您只需要调用private void CheckBoxLoaded(object sender, RoutedEventArgs e) {
dynamic dynamicObject = (sender as FrameworkElement).Tag;
bool checkedState = dynamicObject.IsChecked;
}
对象的PropertyInfo
方法,为其提供您希望从中检索值的实例:
GetValue
答案 1 :(得分:0)
我建议重构它以使用基类或至少一个接口。但是,如果那是不可能的,那么使用 dynamic 就可以解决这个问题:
dynamic obj = t;
bool value = t.IsChecked;
答案 2 :(得分:0)
这会切换状态:
private void CheckBoxLoaded(object sender, RoutedEventArgs e)
{
var prop = e.GetType().GetProperty("IsChecked",
BindingFlags.Instance | BindingFlags.Public);
// read the current value
var current = (bool)prop.GetValue(sender, null);
//and toggle it
prop.SetValue(sender, !current, null);
}
虽然对基础/接口进行重构可能会更清晰,但肯定会表现得更好。如果它总是一个CheckBox,那么这也是一条简单的路线:
private void CheckBoxLoaded(object sender, RoutedEventArgs e)
{
var c = sender as CheckBox;
// read the current value
var current = c.IsChecked;
//and toggle it
c.IsChecked = !current;
}