c#修改泛型属性

c#修改泛型属性,c#,generics,properties,C#,Generics,Properties,我有一个viewmodel,它有两个相同类型的属性(bool)。我喜欢有一个函数,它将一个属性设置为bool值。 假设您拥有IsReadonly属性 public void SetReadOnly(MyViewModel vm, bool newVal) { vm.IsReadOnly = newVal; } 现在我想让它更通用,并为两者提供一个函数: public void SetBooleanProperty(MyViewModel vm, bool newVal, ?bool?

我有一个viewmodel,它有两个相同类型的属性(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;
}
public void SetBooleanproperty(MyViewModel vm、bool newVal、TProp myProperty)
{
vm.??=newVal;
}
我不喜欢使用GetPropertyByName(“IsReadonly”)函数,我认为它在.Net反射类中的某个地方是可用的。
原因:如果其他开发人员重构项目并重命名IsReadonly,字符串将不会得到更新。有解决方法吗?

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

我能想到的最贴切的事情,也就是可怕的,就是在一个动作中通过——这很可笑,但它是有效的。请不要这样做:

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

PerformAction(someViewModel, true, (vm, b) => vm.IsReadOnly = b);
public void performation(MyViewModel虚拟机、布尔纽瓦尔、,
行动(行动)
{
行动(vm、newVal);
}
性能(someViewModel,true,(vm,b)=>vm.IsReadOnly=b);

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

在哪里决定要设置哪个属性的值?当用户选中/取消选中复选按钮时,DeoEndence属性的回调会更改viewmodel属性。出于几个原因,我遍历了一个viewmodel树,并希望两个布尔函数都有一个函数。就这样。我的意思是,在这一点上,你最好公开这两种价值观,并直接改变它们。对。简短的功能仅用于演示。我喜欢在viewmodel树上设置属性。所以这个函数有更多的元素,而不仅仅是一个setter。我的挑战是,将布尔值设置为每个viewmodel的“遍历代码”应该只包含在一个函数中。从维护视图和清晰度来看,对我来说似乎是合理的。为什么您不推荐它?因为您编写的不是像
someViewModel.IsReadOnly=true这样的普通代码,而是
performation(someViewModel,true,(vm,b)=>vm.IsReadOnly=b)。它要求您的属性是公开的,因此没有任何安全好处,而且读取起来很混乱,而且不必要地冗长。看起来很酷并不意味着这是个好主意。人们可以理解的常规代码几乎总是比人们必须弄清楚发生了什么的花哨代码更受欢迎。