切换案例陈述的替代方法

时间:2012-11-15 02:15:01

标签: c# .net design-patterns switch-statement

我写了这个方法,它接受一个通用的参数对象。此方法接受具有不同属性的不同参数对象。这个想法是基于" MethodName"的价值。 property,我可以根据特定参数对象

的属性构造一个URI

我使用反射来获取名为" MethodName的属性的值。"它不是一种方法,只是一个属性名称。

我在case语句中使用MethodName属性的值。这似乎是完成我的任务的一种低级方式。特别是随着MethodNames数量的增长。

以下是case语句实现的源代码。任何帮助将不胜感激。


    public string ConstructBBAPIUri<T>(T parameters)
    {
        var methodName = "";
        var uri = "";
        var userId = "";
        long timeStamp = 0;
        var signature = "";
        var sessionKey = "";
        var newUserId = "";

        if (parameters != null)
        {
            methodName = parameters.GetType().GetProperty("MethodName").GetValue(parameters, null).ToString();

            switch (methodName)
            {
                case "user.login":
                    userId = parameters.GetType().GetProperty("UserId").GetValue(parameters, null).ToString();
                    timeStamp = Convert.ToInt64(parameters.GetType().GetProperty("TimeStamp").GetValue(parameters, null));
                    signature = GenerateBunchBallSignature(userId);

                    uri = "method=" + methodName + "&apiKey=" + apiKey + "&userid=" + userId + "&ts=" +
                          timeStamp + "&sig=" + signature;
                    break;

                case "user.modifyUserId":

                    //We shouldn't need the session key if user.login is being called first
                    userId = parameters.GetType().GetProperty("UserId").GetValue(parameters, null).ToString();
                    newUserId = parameters.GetType().GetProperty("NewUserId").GetValue(parameters, null).ToString();

                    uri = "method=" + methodName + "&sessionKey=" + sessionKey + "&oldUserId=" + userId +
                          "&newUserId=" + newUserId;
                    break;
            }
        }

        return uri;
    }

2 个答案:

答案 0 :(得分:4)

更好的设计是委托在类上构造URI。

  1. 使用方法ConstructBBAPIUri();
  2. 创建一个接口
  3. 为您具有代码访问权限的新类或现有类实现接口
  4. 对于现有的类,您无权访问代码,从这些类继承并实现接口。希望这些类所需的所有属性都可以访问,否则使用反射。

答案 1 :(得分:0)

一个选项是将函数添加到字典中,但我没有看到它比当前方法更好,而且会更容易混淆和容易出错。

我认为Max Shmelev所暗示的将是最好的解决方案。如果可以,请为将要传递的每个类添加一个接口,并为此方法添加一个通用约束。该接口将定义一个方法,当在对象中实现时,将处理该对象的序列化。

如果列表不是太长,你可以为每个不同的类型添加方法来处理,并且在每种情况下只需要一个方法调用。

相关问题