c#修改泛型属性

本文关键字:属性 泛型 修改 | 更新日期: 2023-09-27 18:10:57

我有一个具有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,则该字符串不会得到更新。有解决办法吗?

c#修改泛型属性

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

我能想到的最接近的事情,这是可怕的,将传入一个动作-这是相当荒谬的,但它工作。请不要这样做:

public void PerformAction(MyViewModel vm, bool newVal,
    Action<MyViewModel, bool> action)
{
    action(vm, newVal);
}
PerformAction(someViewModel, true, (vm, b) => vm.IsReadOnly = b);

这不是一个好方法。你不希望组合getter和setter。标准做法是为每个值设置一个getter和setter,这样你就可以控制对它们的访问。为两个变量同时设置getter和setter会破坏设置getter和setter的一般目的。