2011-10-25 78 views
0

我有兩個字符串列表。一個是對象友好名稱,另一個是對象類名稱。重構兩個字符串列表

"Car","Animal","Plane" 

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

我使用友好的名稱顯示用戶輸入和類名通過使用反射動態創建類的實例,所以我需要兩個列表,喜歡你所看到的「汽車」作爲友好的名稱可以綁定「機器。 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

我仍然需要寫下「Car」......此外,有時候,類友好的名稱不僅僅是我決定綁定什麼類名的參數。 – eugeneK

+0

@eugeneK,也許你可以稍微擴展你的問題。可以想象,我們可以創建一個完整的關鍵字(包含名稱和其他任何內容),並將其用作字典中的鍵類型(實現適當的接口)?你可以在你的問題上擴展嗎? –

0
  1. 使用地圖的HashMap保持友好名稱和類名稱映射
0

我不推薦將使用從性能的角度來看類創建對象反射,insteed你可以使用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 
    { 

    } 

保證這個類你應該使用你的類。

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

組合將顯示friendlyname,但在詢問SelectedValue時,您將獲得技術名稱。

+0

這並不那麼簡單,我使用這些列表認爲所有項目不僅適用於數據綁定組合框 – eugeneK