2016-03-22 10 views
1

C#ジェネリックパラメータに制約を指定できますか?そのパラメータは抽象でなければなりませんか? 私は現在、ジェネリックパラメータにパラメータのないコンストラクタが必要なメソッドを持っていますが、抽象的なTが必要なシナリオを実行していますので、抽象的なTsを受け入れるメソッドでオーバーロードすることを望んでいました。ジェネリックパラメータを抽象的に制約する

public static void SomeMethod<T>(IEnumberable<T> SomeParam) where T:SomeBase, new() 
{ 
    T tThing = new T(); 
    //do something simple 
} 
public static T SomeOtherMethod<T>(IEnumberable<T> SomeParam) where T:SomeBase, new() 
{ 
    T tThing = new T(); 
    //do something simple 
} 

public static void SomeMethod<T>(IEnumberable<T> SomeParam) where T:SomeBase, abstract() 
{ 
//do something clever 
} 
public static T SomeOtherMethod<T>(IEnumberable<T> SomeParam) where T:SomeBase, abstract() 
{ 
//do something clever 
} 

答えが「あなたができない」と思われる場合は、賢明な回避策がありますか?

+4

何の抽象ための制約はありません - あなたは、あなたが抽象的制約が必要だと思うことを何をしたいのか、その明確ではないが。あなたは抽象クラス(例えば、あなたのコードの 'SomeBase')であるクラスに制約することができます。 – Jamiec

+2

値または参照型があるかどうかを判断するためにnew-constraintが存在します。しかし、私は抽象的な制約のための実用的な使用を見ることができません。 'IEnumerable 'のメリットとして、 'IEnumerable 'も持っていないことを望みますか? – HimBromBeere

+1

* SomeBase *を新しい抽象クラスに継承してから*を使用するとどうなりますか?T:NewAbstractClass *? – bit

答えて

3

コンパイラに、typeパラメータがabstractであることを確認するように指示することはできません。しかし、あなたはランタイムチェックを行うことができます。

public static void SomeMethod<T>(IEnumerable<T> SomeParam) where T:SomeBase 
{ 
    Type type = typeof(T); 
    if(type.IsAbstract) 
    { 
     throw new Exception(string.Format("Cannot use SomeMethod with type {0} because it is abstract.", type.FullName)); 
    } 

    // Do the actual work 
} 

または:

public static void SomeMethod<T>(IEnumerable<T> SomeParam) where T:SomeBase 
{ 
    Type type = typeof(T); 
    if(type.IsAbstract) 
    { 
     SomeMethodAbstract<T>(SomeParam); 
    } 
    else 
    { 
     SomeMethodNonAbstract<T>(SomeParam); 
    } 
} 
+0

これはうまくいく可能性があります – DJL

関連する問題