反射场访问器,获取属性值

时间:2012-08-11 19:18:10

标签: c# windows-phone-7 reflection properties

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

3 个答案:

答案 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;
}