重构切换语句

时间:2014-05-28 20:34:09

标签: c# .net refactoring switch-statement

我有以下switch语句 - 它从Web Service获取响应并将它们映射到我的对象级别的字段,然后将更新保留到DB。

foreach (var webServiceResponse in response.Values)
{
    switch (webServiceResponse.Name)
    {
        case Constants.A:
          myObject.A = (double) webServiceResponse.Value;
          break;
        case Constants.B:
          myObject.B = (double) webServiceResponse.Value;
          break;
        case Constants.C:
          myObject.C = (double) webServiceResponse.Value;
          break;
          //numerous more same pattern removed for readability
     }
}

是否有更好的模式可以用来摆脱switch语句,只是遍历所有响应并将它们映射到我对象的字段?也许词典是最好的方法 - 如果有人有代码样本或链接到类似的字典吗?

2 个答案:

答案 0 :(得分:0)

你可以使用反射来做,假设Constants.whatever真正匹配myObject上属性的名称。

foreach (var webServiceRespone in response.Values)
{
    PropertyInfo propInfo = myObject.GetType().GetProperty(webServiceResponse.Name);
    if (propInfo != null)
        propInfo.SetValue(myObject, webServiceResponse.Value);
}

答案 1 :(得分:0)

以下是我将使用字典和反射循环遍历所有响应并将其映射到对象上的字段的方法。

这是包含字段定义的字典

   private static Dictionary<string, string> GetAttributeNames()
   {
        Dictionary<string, string> dic = new Dictionary<string, string>()
         {
            { "Name1", "Name - 1" },   
            { "Name2", "Name - 2" }, 
            { "Name3", "Name - 3" }
        };
        return dic;
   }

循环并将它们映射到对象的字段

foreach (KeyValuePair<String, String> row in GetAttributeNames())
{
      myClass myobj = new myClass
      {
          FieldName = row.Value,
          FieldValue = PropertyHasValue(response.Values, row.Key),
      };
}

反思方法

   // using reflection to get the object's property value
    public static String PropertyHasValue(object obj, string propertyName)
    {
        try
        {
            if (obj != null)
            {
                PropertyInfo prop = obj.GetType().GetProperty(propertyName, BindingFlags.Instance | BindingFlags.Public);
                if (prop != null)
                {
                    string sVal = String.Empty;
                    object val = prop.GetValue(obj, null);

                    if (prop.PropertyType != typeof(System.DateTime?))
                        sVal = Convert.ToString(val);
                    else // format the date to contain only the date portion of it
                        sVal = Convert.ToDateTime(val).Date.ToString("d"); ;

                    if (sVal != null)
                    {
                        return sVal;
                    }
                }
            }

            return null;
        }
        catch
        {
            return null;
        }
    }

我确定您可以根据需要进行自定义。