c#修改通用属性

时间:2013-04-25 14:42:40

标签: c# generics properties

我有一个viewmodel,它有2个相同类型的属性(bool)。我喜欢有一个函数,它将其中一个属性设置为bool值。 假设你有一个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,则字符串将不会更新。这是否有解决方案?

2 个答案:

答案 0 :(得分:0)

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

我能想到的最可靠的事情,就是传递一个动作 - 这是非常荒谬的,但它确实有效。请不要这样做:

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

PerformAction(someViewModel, true, (vm, b) => vm.IsReadOnly = b);

答案 1 :(得分:0)

这不是一个很好的方法。你不想组合getter和setter。标准做法是为每个值设置一个getter和setter,以便您可以控制对它们的访问。拥有两个变量的getter和setter会破坏getter和setter的一般目的。