2011-12-04 27 views
1

私はmthodを多く持っていますif and elseです。 Switchでどのように変換できますか?このサンプルメソッドで(IF&Else)の代わりに(Switch)を使用する方法

protected override IRepository<T> CreateRepository<T>() 
{ 
    if (typeof(T).Equals(typeof(Person))) 
     return new PersonRepositoryNh(this, SessionInstance) as IRepository<T>; 
    else if (typeof(T).Equals(typeof(Organization))) 
     return new OrganizationRepositoryNh(this, SessionInstance) as IRepository<T>; 
    else 
     return new RepositoryNh<T>(SessionInstance); 
} 

答えて

2

specificationによると、唯一のsbyte、バイト、ショート、USHORT、INT、UINT、長い、ULONG、CHAR 、文字列、または列挙型をswitchステートメントで使用できるため、基本的にtypeオブジェクトをオンにすることはできません。

ここではNameのタイプを切り替えることができます。それはちょうどstringであり、これをオンにしても問題ありません。

+0

ありがとうございます。しかし 'Name'はハードコードであり、適切ではありません。 – Ehsan

2

Typeのswitch文は使用できません。 bool、char、string、integral、enum、またはnull可能なバージョンのスイッチのみを使用できます。コンパイラパー

:スイッチ式またはcaseラベル

はあなたがすることはできませんブール、文字、文字列、 整数、列挙型、または対応するNULL可能タイプ

2

でなければなりません。 switchの文は、sbyte、byte、short、ushort、int、uint、long、ulong、char、string、またはenum-type(暗黙の変換を含む)のコンパイル時定数でなければなりません。あなたはTypeオブジェクトを持っています。合法で何

法的ではありません何
switch (foo) 
{ 
    case 42: 
     // code 
     break; 
} 

int value = GetValue(); // not a verifiable compile-time constant 

switch (foo) 
{ 
    case value: 
     // code 
     break; 
} 
+0

'typeof演算(何かが)'コンパイル時 – Dani

+0

'typeof演算(何かが)'もサポートされているタイプのものではありませんされ、またそれが暗黙のうちにあるの作品サポートされているタイプの1つに変換可能です。 –

1
  1. 本当にこのようにしたいですか?なぜオブジェクト階層と仮想関数を使用しないのですか?

  2. このコードは

public static void CreateTest<T>() 
{ 
    switch (typeof(T).Name) 
    { 
     case "Int32": System.Console.WriteLine("int"); 
      break; 
     case "String": System.Console.WriteLine("string"); 
      break; 

    } 

} 

static void Main(string[] args) 
{ 
    CreateTest<int>(); 
    CreateTest<string>(); 
    CreateTest<double>(); 

} 
関連する問題