2009-05-19 12 views
3

「ここで、T:WsgTypes.RouteRestriction」Tは私が「ジェネリック医薬品のC#.NET

public static T GetDetails<T>(string code) where T : WsgTypes.RouteRestriction 
    { 
     T details; 
     if (typeof(T) == typeof(WsgTypes.TicketType)) 
     { 
      details = TicketTypeDetail.GetDetails(code) as T; 

     } 
     else if (typeof(T) == typeof(WsgTypes.RouteRestriction)) 
     { 
      details = RouteRestrictionDetail.GetDetails(code) as T; 

     } 
     else 
     { 
      throw new NotSupportedException(""); 
     } 
     return details; 
     throw new NotImplementedException(); 
    } 
+0

これは一般的な方法が設計されたものではありません。いくつかの可能性がある場合は、最初に汎用メソッドを使用しないでください。可能なタイプが3つしかない場合は、3つの異なるメソッドを記述します。ジェネリックスは、タイプが本当に汎用的である場合(無制限数のタイプのいずれかになり得る場合)に設計されています。 –

答えて

1

あなたが複数のインターフェイスを持つ単一のクラスを持つことができます。

public static T GetDetails<T>(string code) where T : WsgTypes.RouteRestriction, , IComparable 
    { 
    } 

代わりに、インターフェイスを持ち、それを実装する複数のクラスを持つことができます。

public interface IInterface 
    {} 

    public class Class1: IInterface 
    {} 

    public class Class2: IInterface 
    {} 

public static T GetDetails<T>(string code) where T:IInterface 
     { 
      T instance; 
      // ... 
      return instance; 
     } 
1

の興味がありますのみいくつかのクラスタイプのものとすることができるように、私は複数のクラスを追加することができますあなたはできないのですか?一般的な方法は、あなたが実装しようとしているすべてのクラスが共通のインターフェースを提供することです。問題は、ジェネリックボディの内部で、コンパイラはジェネリック型のパラメータが曖昧でないことを期待しています。

さて、オブジェクトをパラメータとして受け取り、それをあなたの意志でキャストすることができます。しかし、...いいえ。しないでください。

typeofの代わりにisas演算子を使用することもできます。

1

はconstaintsの詳細については、... ...

http://msdn.microsoft.com/en-us/library/d5x73970.aspx

を、この記事を参照してください。複数の制約を追加することができます。また、任意のクラスのリストではなく、インタフェースや基本クラスによって制約を加えることができます。

は、ここで(上から)複数の制約の例です:継承のために

class Base { } 
class Test<T, U> 
    where U : struct 
    where T : Base, new() { } 
+0

この記事では、同じタイプに対して複数の制約を使用する方法について説明します。つまり、汎用パラメータですべての制約を実装する必要があります。 – OregonGhost

+0

あなたのサンプルは、さまざまなタイプの引数について異なる制約を説明しています。これはおそらくMiralが望むものではありません。 – OregonGhost

+0

ええ - 質問を誤読しました。今編集中... –

0

あなたは、このようにそれらを分離しようとしました:

public static T GetDetails<T>(string code) where T : WsgTypes.RouteRestriction, NextClass, AnotherClass, AndSoOn 
{ 
... 
} 
+0

これはできません – Miral

4

いいえ、ジェネリック型制約は、単一の基本クラスを指定することができます。

複数のインターフェイスを指定できますが、これは「すべて」です。「any of」ではありません。

オーバーロードでは可能ですが、ジェネリックではできません。

5

これはジェネリックの適切な使用ではないようです。 TicketTypeRouteRestrictionには、IDetailedが実装されている方が良いでしょう。

+0

うん、それは私が一般的に説明したものの詳細なバージョンです:) – OregonGhost

関連する問題