【问题标题】:How to merge a method call under different switch cases to make the code generic or optimized?如何合并不同switch case下的方法调用,使代码通用或优化?
【发布时间】:2018-02-20 07:13:13
【问题描述】:

我有一个从数据库中获取员工信息的方法。方法如下,带开关盒

public void RetrieveEmployeeInfo(EmployeeInfoRequest request)
{
    EmployeeStandardInfoResponse response;
    int employeeId;
    switch (request.Type.ToLowerInvariant())
    {
        case "employeeid":
            //Some Logic
            response = GetEmployeeInfoFromDatabase(EmployeeSearchType.ByEmployeeID, employeeId);
            break;
        case "emailaddress":
            //Some Logic
            response = GetEmployeeInfoFromDatabase(EmployeeSearchType.ByEmailAddress, emailAddress:request.Id);
            break;
        default:
            return null;
    }
    return response;
}

“GetEmployeeInfoFromDatabase”的签名是

public EmployeeStandardInfoResponse GetEmployeeInfoFromDatabase(EmployeeSearchType employeeSearchType, dynamic value)
{
    //For simplicity I am returning employee info here
    return new EmployeeStandardInfoResponse();
}

以下是支持类和枚举

public enum EmployeeSearchType
{
    ByEmployeeID = 1,
    ByEmailAddress = 2
}

public class EmployeeInfoRequest
{
    public int Id;
    public string Type;
}

public class EmployeeStandardInfoResponse
{
    public int employeeReferenceId;
    public string employeeDepartment;
    public string employeePfDetails;
    public string employeeName;
    public string employeeEmailAddress;
    public string employeeAddress;
}

如何使 switch case 通用,这样我就不必在每种情况下都调用方法“GetEmployeeInfoFromDatabase”?

【问题讨论】:

  • 只需将 employee 或 emailAddress:request.Id 存储在变量中(顺便说一句:shopuld 这是一个可选的命名参数吗?它不在方法签名中)因此不会编译)并在两次切换后调用该方法。无论如何,这听起来像是一篇评论,很可能会转到codereview.stackexchange.com
  • 除此之外,我看不出您的代码有什么问题。这很容易理解并完成工作。你还期待什么?
  • @HimBromBeere 你是对的。最初我将调用设为可选,但后来在修改后我想在调用 GetEmployeeInfoFromDatabase 时使用动态
  • 另外,EmployeeSearchType (enum) 在这两种情况下是不同的。因此,我正在寻找的是,在做出决定时,我应该能够动态/一般地更改 EmployeeSearchType.ByEmployeeID 或 EmployeeSearchType.ByEmailAddress
  • @ThementalistCoder 你如何连接到 db - ado.net,实体框架?

标签: c# generics switch-statement


【解决方案1】:

以下不是完整的解决方案;但足以帮助您实现您想要实现的目标。想法是:根据用户搜索条件,使用 lambda 表达式语法创建表达式树。在存储库中的最终方法中,您可以传递该表达式并解析它(例如获取 DB sql 查询)以从 DB 获取信息。

public class Program
    {
        static void Main()
        {
            GetEmployeeInfoFromDatabase((e) => e.EmployeeEmail == "UserProvidedEmailAdderessGoesHere");
        }

        public EmployeeStandardInfoResponse static GetEmployeeInfoFromDatabase(Expression<Func<Employee,bool>> exprssion)
        {
           /* parse this exression to build query*/
           /* use as it is if using entity framework*/
        }
    }

    class Employee
    {
        public int EmployeeId { get; set; }
        public string EmployeeEmail { get; set; }
    }
}

this的第二/第三个回答 stack over flow 帖子精美地描述了查询翻译逻辑的表达式。

您可以继续使其更可重用和更通用(不仅限于 Employee 实体)

public EmployeeStandardInfoResponse static GetEmployeeInfoFromDatabase<T>(Expression<Func<T,bool>> exprssion)
            {
               /* parse this expression to build query*/
               /* use as it is if using entity framework*/
            }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-01-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多