当前位置:  开发笔记 > 编程语言 > 正文

寻找一种设计模式来取代huuuge如果对象类型

如何解决《寻找一种设计模式来取代huuuge如果对象类型》经验,为你挑选了1个好方法。

好的,所以我正在寻找一些看起来大致如下的代码:

void DoSomething(object o)
{
    if (o is Sometype1) { 
    //cast o to Sometype and do something to it
    }
    else if (o is Sometype2) {
    //cast o to Sometype2 and do something to it
    }
    ...
    else if (o is SometypeN) {
    //cast o to SometypeN and do something to it
    }
}

现在一种方法是使所有o用作参数的对象实现类似的接口

interface ICanHaveSomethingDoneToMe
{
    //expose various properties that the DoSomething method wants to access
}

但问题是我不希望我的所有对象都实现这个接口 - 做某事的逻辑并不真正属于他们.我应该使用什么模式来处理这个问题?

我怀疑像是一系列的实现

interface IPropertiesForDoingSomethingTo
{
    //expose various properties that the DoSomething method wants to access
}

可能会更好.我有一个针对我想要做的每个对象类型的实现,但后来我遇到了这个新问题.我需要有一个像这样的方法

IPropertiesForDoingSomethingTo GetPropsGeneric(T t);

但这是否需要对其进行大规模切换?我应该用类似的方法定义一个类

IPropertiesForDoingSomethingTo GetProps(Someobject1 t);
...
IPropertiesForDoingSomethingTo GetProps(SomeobjectN t);

与在运行时无法添加新类型的通用版本相比,这会产生问题.是否有人可以使用GetPropsGeneric中的DI容器解决容器?谢谢!



1> Steven A. Lo..:

每次看到正在检查对象类型的switch语句(或一系列if语句)时,这都是缺少基类或接口的Big Red Flag.换句话说,代码应该依赖于多态,而不是测试对象类型

如果你不能改变基类或实现一个接口,你可能会留下一个字典来模拟动态调度.在C#中,您可以对包含强制转换的方法使用匿名委托

至于属性访问,如果属性不符合并且通过反射访问不是一个选项,您可能需要在上面的方法/委托中提取属性值并将它们传递给泛型函数

推荐阅读
刘美娥94662
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有