如何将这种多种类似方法重构为单个方法?

时间:2009-04-13 20:00:53

标签: c# refactoring properties

假设我有许多相关的类都有这样的方法:

protected override OnExecute()
{
    this.constructorParm.BoolProperty = !this.constructorParm.BoolProperty;
}

constructorParm的类型可能会更改(也可能是static Setting),特定属性肯定会更改,但属性的类型将始终为{{ 1}}。

进一步假设我已经决定让8个不同的类在实现级别上执行完全相同的操作是愚蠢的 - 切换bool值。特别是当它们在语义层面上都相关时(它们都来自相同的bool抽象基类,这是Command来自的地方。)

如何在不参数化实际切换操作本身的情况下参数化我想要切换的属性?例如,我知道我可以做这样的事情(未编译):

OnExecute()

但我怎样才能捕获类中的切换行为,同时仍然接受可写属性作为参数? (如果我将切换作为参数传递,那么我只是制作一个过于复杂的委托。)

(我不能只用b / c传递属性internal class CommandX { Action doExecute = null; public CommandX(Action executeAction) { this.doExecute = executeAction; } protected override OnExecute() { this.doExecute(); } } // elsewhere var b = new CommandX(() => {target.BoolProperty = !target.BoolProperty;}); 是一个值类型,所以我只是翻转一个副本。我不能通过ref传递它,当然,b / c属性不能通过ref传递。我觉得必须有一些愚蠢和显而易见的东西,我真的很想念这里。:))

上下文

我以间接方式做这么简单的事情的原因实际上是由于在winforms中使用了GoF Command模式。核心功能bool更复杂,但Command的这个小子集基本上只是切换一个将在别处引发PropertyChanged事件的属性。

,我希望将它们折叠成一个,而不是将所有这些命令放在不同的类中

3 个答案:

答案 0 :(得分:2)

您可以使用Reflection来选择要使用PropertyInfo类切换的属性:

string propertyName = "BoolProperty";
Foo myFoo = new Foo();
Type myFooType = myFoo.GetType();
PropertyInfo prop = myFooType.GetProperty(propertyName);
prop.SetValue(myFoo, !((bool)prop.GetValue(myFoo, null)), null);

您只需要保留要切换的媒体资源的名称。

然而,这只有在“切换属性”明确表示您的设计时才有意义。否则,当“简单”解决方案只是正常切换财产时,对于这个基本的东西来说肯定会有点过分。

答案 1 :(得分:0)

您可能可以使用反射来指定要更改的属性,但是如果选项数量有限(您提到有8个类),我建议您使用switch语句,并使用枚举类构造函数。

internal enum PropertyOption { Prop1, Prop2 }

internal class Bar {
  PropertyOptiion prop;
  public Bar(PropertyOption prop) {
    this.prop = prop;
  }
  public override OnFoo() {
    switch (prop) {
      case PropertyOption.Prop1:
        this.prop1 = !this.prop1;
        break;
      case PropertyOption.Prop2:
        this.prop2 = !this.prop2;
        break;
    }
  }
}

答案 2 :(得分:0)

这里有一些好的答案

我担心我不是这些人的专家。但我认为情况类似。

Can you refactor out a common functionality from these two methods?