1

我有一个 Human 类,需要获取“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;
}
4

3 回答 3

1

我假设由于某种原因你不能重构你的Human类来实现一些ICheckable接口,包含IsChecked,对吧?

如果您使用的是 C# 4.0,另一种方法是使用dynamic数据类型,这将允许您设置仅在运行时检查的属性:

private void CheckBoxLoaded(object sender, RoutedEventArgs e) {
     dynamic dynamicObject  = (sender as FrameworkElement).Tag;
     bool checkedState = dynamicObject.IsChecked;
}

如果所有其他方法都失败了并且你真的必须使用反射,那么你已经完成了 90% 的工作。您只需要调用PropertyInfo对象的GetValue方法,为其提供您希望从中检索值的实例:

PropertyInfo prop = t.GetType().GetProperty("IsChecked"); // Simpler.
var isChecked = prop.GetValue(t, null);
(sender as CheckBox).IsChecked = isChecked;
于 2012-08-11T19:23:31.673 回答
0

我建议重构它以使用基类或至少一个接口。但是,如果这是不可能的,简单地使用动态可以做到这一点:

dynamic obj = t;
bool value = t.IsChecked;
于 2012-08-11T19:26:22.597 回答
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;
} 
于 2012-08-11T20:08:58.380 回答