2011-07-07 9 views
0

非ジェネリックメソッドを呼び出し、ジェネリックタイプが異なるジェネリック引数を渡すソリューションはありますか?非汎用メソッド(汎用<Base> [] args)を呼び出し、汎用<Derived>の配列を渡しますか?

私の想像の夢:

void FooBulous(Foo<object>[] fooArray) { } // Accept any 'Foo<BaseType>' 

var fooArray = new Foo<object>[] // Array of 'Foo<BaseType>' 
{ 
    new Foo<Cat>(), 
    new Foo<Dog>(), 
}; 

FooBulous(fooArray); // Pass the 'Foo<BaseType>[]' array 

私の現実:要するに

void BarBaric(object[] barArray) { } // Can't constrain to 'Foo<>' 

var barArray = new object[] // Same problem 
{ 
    new Bar<Cat>(), 
    new Bar<Dog>(), 
}; 

BarBaric(barArray); // Barbaric! I thought the 'void *ptr' days were over! 

void Fee(object[] params)  { /* WORKS! But not constrained to 'Foo<Base>' */ } 
void Fie(Foo<Cat>[] params) { /* Does not accept 'Foo<Dog>' */ } 
void Foe(Foo<>[] params)  { /* ERROR: 'Type expected' */ } 
void Fum(Foo<object>[] params) { /* Cannot convert 'Foo<Cat>' to 'Foo<object>' */ } 

明らかに、これはできません...クリーンな代替手段はありますか?

+0

おそらく、「ダイナミック」の乱用を含む*汚れた代替品があります。 – Brian

答えて

5

Foo<Cat>Foo<object>ではありません。その後Foo<Cat>は常にMethodinputパラメータのCat値を期待

public class Foo<T> 
{ 
    public void Method(T input) 
    { 
     ... 
    } 
} 

Fooはこのように見えたとします。あなたはFoo<object>としてFoo<Cat>を扱うことができればしかし、あなたが行うことができます:

Foo<Cat> catFoo = new Foo<Cat>(); 
Foo<object> objectFoo = catFoo; 
objectFoo.Method(new object()); // Eek! Type safety is broken! 

一般的な分散は、.NET 4(およびC#4)が、インタフェースおよび代表者のためののみで利用可能である、とだけ用型パラメータ宣言の時点でoutinで適切に装飾されたもの。それはあなたにとって役に立つかもしれないし、そうでないかもしれない。

Foo<T>は、抽象的な非総称ベースクラスFooから派生させて、Tとは関係のないすべてのメンバーを提供することです。

void Foobulous(Foo[] fooArray) 

... 

Foobulous(new Foo[] { 
    new Foo<object>(), 
    new Foo<Cat>(), 
    new Foo<Dog>() 
}); 

を、すべてがそう長くFoobulousTに頼った方法のいずれかを使用する必要はありませんでしたとして、うまくだろう - それは、それはFooの値を取ることができることを与えないでください。そして、あなたは書くことができますとにかくさまざまな型のパラメータで。

+0

華麗な説明 – sehe

+0

本当に、私は、この問題を解決するために、メソッドを呼び出すことができました。配列を作成することができれば、メソッドに渡すことができます。 –

+0

@Jon Skeet 'Foo <>'はエンティティフレームワーク 'DbSet <>'です。これは 'DbQuery <>'です。これは 'オブジェクト'です。ですから、巧妙なリファクタリングがない限り、私は 'object []'に固執しています。 –

関連する問題