2011-10-25 7 views
0

私は2つの文字列のリストを持っています。 1つはオブジェクトフレンドリ名であり、他の1つはオブジェクトクラス名です。2つの文字列のリファクタリング

"Car","Animal","Plane" 

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

私は動的にリフレクションを使用して、クラスのインスタンスを作成するために、ユーザの入力やクラス名を表示する親しみやすい名前を使用するので、私はあなたがフレンドリ名として「車」を参照してくださいすることができ、両方のリストを必要とするなどの機械」にバインドすることができます。 cs "と表示されます。

1つの文字列を他の文字列に変換するswitch文を使用するのではなく、これらの両方のリストを翻訳して作業する独創的な方法が必要です。これらのリストには多数の項目があります。さらに、評価のためにテスト名の文字列を送信することもありますが、同じスペリングの問題はそこに適用できます。

私はenumの使用について考えようとしましたが、まだ数字は両方のリスト間の変換にベルを鳴らしません。

答えて

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 

::適切なクラスを作成する

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

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

は同じくらい簡単です

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

完全実施例でありますon http://ideone.com/TTuBP

フレンドリ名とクラス名のマッピングを維持するために、
+0

+1。私は同じ答えを供給するつもりだった。 – Fenton

+0

いいね、神様はあなたを祝福します! – eugeneK

+0

typoを修正して作業例を追加しました:http://ideone.com/TTuBP – sehe

0

なぜ辞書を使用しないのですか?あなたがインスタンス化できることを、本当の種類を望んでいた場合

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