2011-06-18 10 views
5

こんにちは私はこのようなメソッドを持っています。 私が呼ぶときは、そのままそれが動作します。私は何をしたいかジェネリックメソッド返す異なるジェネリックコレクション

Categories = LoadR<ObservableCollection<Category>,Category>(); 
Products = LoadR<XObservableCollection<Product>,Product>(); 

は、この(追加のパラメータとしてKを渡す避ける)などの呼び出しにすることです:

Categories = LoadR<ObservableCollection<Category>>(); 
Products = LoadR<XObservableCollection<Product>>(); 

を私は知っている私は拡張子を書くことができます。 しかし、それがなければこれを実現する方法があるのか​​不思議です。

マンフレッド

答えて

1

私はできないと思います。

C#には、メソッドパラメタを使用するときにジェネリックメソッドを理解するためのメカニズムがありますが、同じメソッドの他の汎用引数からは理解できません。それは動作しません。

たぶん、あなたはあなたの署名を変更することができます。

private static ObservableCollection<K> LoadR<K>(.ObservableCollection<K> onC) 
     where K : IStoreElement, new() 
    { 
     //.... 
     return onC; 
    } 

使い方は次のようになります。私は良いことではない、と私ができるSE、それはあなたが探しているものではありません同意

static void TestLoad() 
    { 
     var result1 = LoadR(new ObservableCollection<Something>()); 
     var result2 = LoadR(new DerivedClassFromObservableCollection<Something>()); 
    } 

しかし、C#でない場合は、汎用引数から型を推測しようとします。

.....

aroudnそれは、特定のコレクションを使用することです他の方法。私はあなたがこれをさらに望んでいないのを見ることができます。

だから、あなたが行うことができます一つのことは、あなたが使用法のようなものになり、それが代わりにIEnumerableをを返すようです:あなたは、コレクション自体に派手なものをしたい場合にも良くないかもしれません

static void TestLoad() 
    { 
     var result1 = new ObservableCollection(LoadR<Something>()); 
     var result1 = new DerivedClassFromObservableCollection(LoadR<Something>()); 
    } 

あなたがもうそれを所有していないからです。

....

私は非常に最初のオプションです。

関連する問題