0

我有一个具有 2 个相同类型(布尔)属性的视图模型。我喜欢有一个将属性之一设置为布尔值的函数。假设您有一个 IsReadonly 属性。

public void SetReadOnly(MyViewModel vm, bool newVal)
{
    vm.IsReadOnly = newVal;
}

现在我想让它更通用,并且对两者都有一个功能:

public void SetBooleanProperty(MyViewModel vm, bool newVal, ?bool? myProperty)
{
    vm.myProperty = newVal; // sure this is an error, myProperty doesn't exist in the viewmodel. But that shows the way i like to have. 
}

我开始了这种方法:

public void SetBooleanproperty<TProp>(MyViewModel vm, bool newVal, TProp myProperty)
{
     vm.??? = newVal;
}

我不喜欢使用 GetPropertyByName("IsReadonly") 函数,我认为它在.Net 的反射类中的某处可用。原因:如果另一个开发人员重构项目并重命名 IsReadonly,则字符串不会得到更新。有解决方案吗?

4

2 回答 2

0

您正在尝试使用反射而不使用反射。我不认为你会找到答案。语言中没有针对属性的泛型。

我能想到的最糟糕的事情就是传递一个动作——这很荒谬,但它确实有效。请不要这样做:

public void PerformAction(MyViewModel vm, bool newVal,
    Action<MyViewModel, bool> action)
{
    action(vm, newVal);
}

PerformAction(someViewModel, true, (vm, b) => vm.IsReadOnly = b);
于 2013-04-25T14:49:34.657 回答
0

这不是一个好方法。您不想结合 getter 和 setter。标准做法是为每个值设置一个 getter 和 setter,以便您可以控制对它们的访问。对两个变量都有一个 getter 和 setter 违背了拥有 getter 和 setter 的一般目的。

于 2013-04-25T14:49:35.560 回答