重构两个字符串列表

时间:2011-10-25 10:54:25

标签: c# .net

我有两个字符串列表。一个是对象友好名称,另一个是对象类名称。

"Car","Animal","Plane"

"MachineClass","AnimalClass","FlyClass".

我使用友好名称来显示用户输入和类名,以通过使用反射来动态创建类实例,所以我需要两个列表,就像你可以看到“Car”一样友好名称可以绑定到“Machine.cs”。 / p>

我需要一些更有创意的方式来处理和翻译这两个列表,而不是使用从一个字符串转换为另一个字符串的switch语句,这些列表有很多项目,我可以进行小拼写,这将导致错误。此外,有时,我发送测试名称的字符串用于评估,而拼写的相同问题可以在那里应用。

我试着考虑使用枚举,但数字不会响起两个列表之间的转换。

5 个答案:

答案 0 :(得分:4)

 public enum Things
 {
     Car,
     Animal,
     Plane
 }

 var dict = new Dictionary<Things, string> {
      { Things.Car, "MachineClass" },
      { Things.Animal, "AnimalClass" },
      { Things.Plane, "FlyClass" } };

 string classname = dict[Things.Plane]; // FlyClass

现在,如果你想要真正的类型,你可以实例化:

var realtypes = dict.ToDictionary(
        kvp => kvp.Key,
        kvp => System.Type.GetType("Namespace." + kvp.Value));

完整的工作示例位于http://ideone.com/TTuBP

using System;
using System.Collections.Generic;
using System.Linq;

//public interface IThing {} 
public class MachineClass /* : IThing */ { }
public class AnimalClass  /* : IThing */ { }
public class Plane        /* : IThing */ { }

public class Program
{
     public enum Things
     {
         Car,
         Animal,
         Plane
     }

     private static readonly IDictionary<Things, string> _classNameMap = 
         new Dictionary<Things, string> {
          { Things.Car,    "MachineClass" },
          { Things.Animal, "AnimalClass"  },
          { Things.Plane,  "FlyClass"     }  };

     public static void Main(string[] args)
     {
         var realtypes = _classNameMap.ToDictionary(
                 kvp => kvp.Key,
                 kvp => System.Type.GetType(/*"Namespace." +*/ kvp.Value));

         Type dynamicType = realtypes[Things.Plane]; // typeof(Namespace.FlyClass)

         foreach (var realtype in realtypes)
             Console.WriteLine("{0}, class {1}", 
                     realtype.Key, realtype.Value);
     }

}

答案 1 :(得分:0)

为什么不使用字典?

Dictionary<string, string> classMap_ = new Dictionary<string, string>(StringComparer.OrdinalIgnoreCase);

classMap_["Car"] = "MachineClass";
classMap_["Animal"] = "AnimalClass";
classMap_["Plane"] = "FlyClass":

创建适当的类非常简单:

string className = classMap_["Car"];

答案 2 :(得分:0)

  1. 使用地图HashMap维护友好名称和类名映射

答案 3 :(得分:0)

我不建议从性能的角度使用反射来创建类的创建对象,并且可以使用lambda表达式来创建对象 看下面的代码

            var animals = new Dictionary<string, Func<object>>
                          {
                              {"Animal 1", () => new MyAnimal1()},
                              {"Animal 2", () => new MyAnimal2()}
                          };

        var createAnimal = animals["Animal 1"];
        var animal = createAnimal();

其中

    private class MyAnimal1
    {

    }

    private class MyAnimal2
    {

    }

这些课程你应该使用你的课程。

答案 4 :(得分:0)

为什么不使用数据绑定?

class Wrapper
{
  public string UserFriendly{get;set;}
  public string Technical{get;set;}
}

var data = new[]
{
    new Wrapper("Car", "MachineClass"),
    new Wrapper("Plane", "FlyClass"),
};

combo.Datasource = data;
combo.DisplayMember = "UserFriendly";
combo.ValueMember = "Technical";

组合将显示友好名称,但在询问SelectedValue时,您将获得技术名称。