.Net 4.0 优化代码,重构现有的“if”条件和“is”运算符

2023-12-05

我有以下 C# 代码。效果很好;但是GetDestination()方法杂乱地包含多个if条件通过使用是运算符.

在 .Net 4.0(或更高版本)中,避免这些“if”条件的最佳方法是什么?

编辑:角色是业务模型的一部分,目的地纯粹是使用该业务模型的一个特定应用程序的工件。

CODE

public class Role { }
public class Manager : Role { }
public class Accountant : Role { }
public class Attender : Role { }
public class Cleaner : Role { }
public class Security : Role { }

class Program
{
    static string GetDestination(Role x)
    {
        string destination = @"\Home";

        if (x is Manager)
        {
            destination = @"\ManagerHomeA";
        }

        if (x is Accountant)
        {
            destination = @"\AccountantHomeC";
        }

        if (x is Cleaner)
        {
            destination = @"\Cleaner";
        }

        return destination;

    }

    static void Main(string[] args)
    {
        string destination = GetDestination(new Accountant());
        Console.WriteLine(destination);
        Console.ReadLine();
    }
}

参考

  1. Dictionary 具有不同类型的委托:更清晰的非字符串方法名称?
  2. Jon Skeet:让反思飞翔并探索代表
  3. if-else 与 switch 与委托字典
  4. 带委托或开关的字典?
  5. C# 中的表达式和委托

Having virtual在派生类中重写的属性应该可以解决问题:

class Role
{
    public virtual string Destination { get { return "Home"; } }
}
class Manager : Role
{
    public override string Destination { get { return "ManagerHome;"; } }
}
class Accountant : Role
{
    public override string Destination { get { return "AccountantHome;"; } }
}
class Attender : Role
{
    public override string Destination { get { return "AttenderHome;"; } }
}
class Cleaner : Role
{
    public override string Destination { get { return "CleanerHome;"; } }
}
class Security : Role { }

我没有使属性抽象,以提供默认值Home当它没有在派生类中被重写时的值。

Usage:

string destination = (new Accountant()).Destination;
Console.WriteLine(destination);
Console.ReadLine();
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

.Net 4.0 优化代码,重构现有的“if”条件和“is”运算符 的相关文章

随机推荐

  • 如何分离由 subprocess.call 运行的程序?

    我正在使用 subprocess call 使用默认应用程序打开 pdf 文件 如下所示 subprocess call xdg open pdf stderr STDOUT 但是 当运行该进程时 该进程已附加到终端 我想将其分离 基本上
  • Windows 中是否有相当于 cron 的工具?

    我想知道是否有同等的cron在 Windows 中以及如何使用 PHP 以编程方式使用它 Windows 有Scheduled Tasks控制面板小程序 或更高版本的 Windows 上的管理控制台插件 但您也可以通过以下方式访问它scht
  • 防止应用程序升级时数据丢失

    我们开发了一款 Android 应用程序 并通过 MDM 移动设备管理 Soti Mobi 控制 推送新的安装和更新 发送的更新会静默升级应用程序 无需用户确认 因此 如果用户正在使用应用程序 应用程序会自动停止 升级并从头开始启动 因此用
  • grep (bash) 多行模式

    在 bash 4 3 46 1 中 我有一些多行所谓的 fasta 记录 其中每个记录都是由 gt name 和以下几行 DNA 序列 AGCTNacgtn 启动 这里有三个记录 gt chr1 AGCTACTTTT AGGGNGGTNN
  • 请求了 n 条推文,但 API 只能返回 0 错误

    我无法使用 R 中的 twitteR 包检索任何推文 例如此请求 nbahash tweets searchTwitter nba since 2013 01 01 until 2014 02 25 n 20 显示此警告消息 警告消息 在
  • 如何在 Dropbox API v2 中创建不过期令牌?

    正如标题所说 最近 Dropbox API 改版后 Token 开始有过期时间了 以前如果我不撤销的话 Token是可以永久使用的 也许出于安全原因添加了过期时间 然而 这对于我的应用来说非常不方便 我需要上传文件很长时间 可能一次超过一个
  • 使用另一个数组从数组中删除条目

    不知道该怎么做 所以非常感谢任何帮助 说我有 const array1 1 1 2 3 4 const array2 1 2 所需输出 const result 1 3 4 我想比较一下array1 and array2对于每个条目arra
  • 从 Zend Controller 插件中获取视图对象

    在我的控制器中 我有一个 postDispatch 来整合我的 FlashMessenger 消息 public function postDispatch messages this gt helper gt getHelper Flas
  • 在更新之前的代码签名证书后,如何在 Windows 10 中保留 SmartScreen 筛选器的声誉?

    我在过去 3 年里拥有代码签名证书 当我用它签署我的软件时 签名没有导致任何问题SmartScreen从 Internet 下载软件时出现警告 该证书本月到期 因此我在同一家公司续签了三年 它造成的问题是 现在当我签署我的软件时 新证书在
  • 将任务放入序列容器后无法连接到数据库

    我有一个工作完美的包 直到我决定将它的一些任务放入序列容器中 更多关于我为什么要这样做的信息 在我的情况下如何进行 SSIS 交易 现在 我不断收到错误 Execute SQL Task Error Failed to acquire co
  • 处理每个数组条目的替换,无需 Eval

    例如 我有一个任意字符串数组a 1st 2nd string 3rd nstring n 例如 我想将这些字符串传递给将其参数解释为文件的命令paste 对于固定数量的变量 我们可以使用过程替换 paste lt printf s var1
  • GCP Secret Manager:Spring Boot 应用程序中未解析环境变量和密钥

    下列的本指南 and 这段代码示例 我的里面有这个application deploy yaml spring following cloud gcp project id PROJECT ID Set during build proce
  • 按天分组并仍然显示没有行的日子?

    我有一个日志表 其中包含一个名为 logTime 的日期字段 我需要显示日期范围内的行数以及每天的记录数 问题是我仍然想展示那些日子没有记录 是否可以仅使用 SQL 来完成此操作 Example SELECT logTime COUNT F
  • 如何处理glBufferData期间的GL_OUT_OF_MEMORY错误?

    OpenGL 参考文献提到了GL OUT OF MEMORY error 记录此错误后 除了错误标志的状态外 GL 的状态未定义 功能glBufferData如果无法消化给定的数据 可能会生成此错误 但另一方面 API 似乎没有提供任何方法
  • Swift 5 与 SwiftUI:如何动态更改环境区域设置

    我必须让用户从列表中选择应用程序的语言 将下一行放入 SceneDelegate 中效果很好 因为它在开头加载指定的语言 window rootViewController UIHostingController rootView Cont
  • 从 64 位汇编调用 C 函数

    在 ubuntu 16 04 上 cat hola asm extern puts global main section text main mov rdi message call puts ret message db Hola 0
  • 在 iText 7 中实现 PdfContentByte 和 PdfTemplate 的替代方法是什么

    我正在努力从 iText 5 迁移到 iText 7 我的 iText 5 代码如下 我不确定应该使用 iText 7 中的哪种替代方案 可能是 Canvas 来实现PdfContentByte and PdfTemplate produc
  • 将字符串中的算术公式转换为值

    我有一个表 其中所有条目均采用算术公式的形式 即1 2 3 etc 在此表中 所有列都是类型varchar 该表有很多这样的列 我想计算公式并将值插入另一个公式 关于如何实现这一目标有什么建议吗 你可以试试这个 我希望这可以帮助你 它从 t
  • WCF 服务应抛出什么异常类型?

    我正在将代码从 ASMX 转换为 WCF 在我的 ASMX Web 服务中 我抛出 SOAP 异常 例如 if ex InnerException null SoapException se new SoapException ex Mes
  • .Net 4.0 优化代码,重构现有的“if”条件和“is”运算符

    我有以下 C 代码 效果很好 但是GetDestination 方法杂乱地包含多个if条件通过使用是运算符 在 Net 4 0 或更高版本 中 避免这些 if 条件的最佳方法是什么 编辑 角色是业务模型的一部分 目的地纯粹是使用该业务模型的