2016-08-14 7 views
0

汎用抽象クラスを取る汎用メソッドの作成を簡略化できる簡単な方法があるかどうかを知りたいと思います。 それは次のようになります。Cで汎用クラスを持つ汎用メソッド

public J Read<T, M, J>(string fileName) where T : FileAccess<M, J> where M : Accessor where J : new() { 
     /*More Code... return J*/ 
    } 

FileAccessのクラスは、同じ一般的な「引数」を取ります。

public abstract class FileAccess<T, M> : IDisposable where T : Accessor where M : new() {/* More Code*/} 

この抽象クラスを実装する他のクラスがあります。例えば

public class StateAccess : FileAccess<XMLAccessor, List<Data>> {/*More Code*/} 

倍のC#のほとんどは、あなたが使用している他の一般的なタイプのそれを理解してくれているので、あなたはそれらを記述する必要はありません。

Read<StateAccess>("state"); 

しかし、その代わりに、これは、私はそれを動作させるために何をすべきかです::私はそれは同じように機能するだろうし、それはこのようなものを終わるだろうと思っ

Read<StateAccess, XMLAccessor, List<Data>>("state"); 

でもすでにIかかわらず、 XMLAccessorとデータのリストを使用するClass StateAccessを作成しました。

Method Readは、FileAccessorを継承する他のクラスで使用されます。 私の質問は次のようなものです。私はコードの仕組みをどうすれば完成させることができますか?

Read<StateAccess>("state"); 
Read<OtherAccess>("otherFileName"); 

ありがとうございました。

+1

私はそれが可愛いとは思わない。 C#では_all_一般的な引数を宣言するか_none_(コンパイラが_all_の引数を単独で推論できる場合)を宣言する必要があります。 c#では、必要な引数のサブセットのみを宣言することはできません。 –

+0

ああ、それは悲しいニュースです。このメソッドを変更する方法はありますか?そのため、ジェネリックは非抽象クラスでなければならず、クラスは非ジェネリックである必要があります。 –

答えて

2

Renéのコメントは正しいです。ここでは一般的な議論の部分集合を推論することはできません。あなたは何ができるか

、このようなものである(ジェネリック型Mで何もしないReadあなたの方法があると仮定):

interface IReadableFileAccess<J> { ... // methods that Read needs... } 

その後FileAccessまたはStateAccessIReadableFileAccessを実装し、Readの署名を変更しますあなただけのため閉鎖され、StateAccessのインスタンスを渡すことができ

J Read<J>(IFileAccess<J> access, String fileName, ... whatever ...) { ... } 

これに:へ:

Read(someStateAccess, "fileName") 

注:「Jのため休館」は、上記StateAccessはJの型が指定されているJ-ための一般的なので、推察ではないことを意味します。

+0

それは働いて、ありがとう。 –

関連する問題