2013-04-25 73 views
0

我有一个viewmodel具有2个相同类型的属性(布尔)。我喜欢有一个函数将其中一个属性设置为布尔值。 假设您有一个IsReadonly属性。c#修改一个通用的属性

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,则字符串不会更新。有没有解决这个问题的方法?

+0

你在哪里决定要设置哪个属性值? – Dilshod 2013-04-25 14:49:33

+0

当用户选中/取消选中按钮时,deoendency属性的回调将更改viewmodel属性。出于以下几个原因,我遍历了一个视图模型树,并且对两个布尔值都有一个函数。而已。从维修视图和清晰度看, – deafjeff 2013-04-25 14:56:55

回答

0

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

我能想到的最糟糕的事情,这是可怕的,将通过一个行动 - 这是非常荒谬的,但它的作品。请不要这样做:

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

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

看起来似乎合情合理。为什么你不会推荐它? – deafjeff 2013-04-25 15:03:46

+1

因为不是像编写'someViewModel.IsReadOnly = true'这样的普通代码,而是写'PerformAction(someViewModel,true,(vm,b)=> vm.IsReadOnly = b);'。它要求你的财产是暴露的,所以没有任何安全利益,并且它是令人困惑的阅读和不必要的冗长。只是因为某些东西看起来很酷并不意味着这是个好主意。人们可以理解的常规代码几乎总是优于代码,人们必须弄清楚发生了什么。 – 2013-04-25 15:08:30

0

这不是一个好方法。你不想把吸气剂和吸附剂结合起来。标准做法是为每个值设置一个getter和setter,以便您可以控制对它们的访问。对于两个变量都有一个getter和setter,这就打破了getter和setter的一般目的。

+0

我的意思是,在这一点上,你可能会公开两个值并直接改变它们。 – NathanTempelman 2013-04-25 14:51:14

+0

没错。简短的功能只是为了演示。我喜欢在viewmodel树上设置属性。所以这个函数有更多的狮子,不仅仅是一个setter。我的挑战是,为每个视图模型设置布尔值的“遍历代码”应该只在一个函数中。 – deafjeff 2013-04-25 15:02:34