2011-10-25 7 views
0

У меня есть два списка строк. Один - это объектно-ориентированное имя, а другое - имя класса объекта.Рефакторинг двух списков строк

"Car","Animal","Plane" 

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

Я использую дружественные имена, чтобы показать пользовательского ввода и имена классов динамически создавать экземпляры класса с помощью отражения, так что мне нужно в обоих списках, и как вы можете видеть, «Автомобиль», как дружественное имя может быть связано с «Machine. CS».

Мне нужен более креативный способ работы и перевода обоих этих списков, а не использование оператора switch, который преобразуется из одной строки в другую, эти списки содержат множество элементов, и я могу сделать небольшую орфографию, которая вызовет ошибку. Кроме того, иногда я отправляю строку имени теста для оценки, тогда как такая же проблема с написанием может применяться там.

Я попытался подумать об использовании перечислений, но все же цифры не звонили в колокол для конверсий между обоими списками.

ответ

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); 
    } 

} 
+0

+1. Я собирался дать тот же ответ. – Fenton

+0

Ницца, да благословит вас Бог! – eugeneK

+0

Исправлена ​​опечатка и добавлен рабочий пример: http://ideone.com/TTuBP – sehe

0

Почему бы не использовать словарь?

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

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

Создание соответствующего класса так просто, как:

string className = classMap_["Car"]; 
+0

Еще мне нужно будет записать «Автомобиль» ... кроме того, классное имя - это не только параметр, из которого я принимаю решение, какое имя класса связывать. – eugeneK

+0

@eugeneK, возможно, вы можете немного расширить свой вопрос. Возможно, мы могли бы создать цельный ключ со всеми вашими требованиями (имена и все остальное) и использовать его в качестве ключевого типа в словаре (реализация соответствующих интерфейсов)? Можете ли вы расширить это в своем вопросе? –

0
  1. Использование карты HashMap для поддержания дружественное имя и имя классов отображений
0

Я не рекомендую использовать отражение для объектов создания классов с точки зрения производительности, insteed вы можете использовать лямбда-выражения для создания объекты рассмотрим следующий код

  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 
    { 

    } 

В этом уроке вы должны использовать свои классы.

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"; 

Combo отобразит дружеское имя, но при запросе SelectedValue вы получите техническое имя.

+0

Это не так просто, я использую этот список, который думал, что все проекты предназначены не только для привязки данных привязки – eugeneK

Смежные вопросы