4

具体的には、次のように使用できるエクスポート関数を作成します。

List<HistoryBook> HistoryBooks = something;
List<MathBook> MathBooks = something;
List<ScienceBook> ScienceBooks = something;

ExcelExporter.Export(FileName, HistoryBooks, MathBooks, ScienceBooks);

以下のコードのようなものを考えましたが、この場合、すべてを「オブジェクトのリスト」にキャストする必要がありますが、これは私が望むものではありません。

public void Export(string FileName, params List<object>[] Data)

これを上品に解決するためのヒントを教えてください。

4

3 に答える 3

4
class Book {}

class ScienceBook : Book {}

class MathBook : Book  {}

class ScienceBook : Book {}

public void Export(string FileName, IList<Book> Data)

または、そのためのインターフェースを使用できます。例:インターフェイスIBook {}

于 2012-04-03T06:45:32.200 に答える
4

あなたが言うように、完全に無関係なリストを渡すことができるようにしたい場合は、ベースのIListインターフェースを受け入れる必要があります。

public void Export(string FileName, params IList[] Data)

すべてのList<T>オブジェクトはIList、ジェネリックと同様にを実装IList<T>するので、それを強制することができます。

実際、エクスポーターでこれらのリストをどのように処理する必要があるかに応じて、IEnumerable必要なのが転送のみの読み取り1回限りの機能である場合は、強制するだけで十分です。

決定する最良の方法は、すべてのパラメーターに必要な共有機能を決定し、その機能を適用するためのメソッドシグネチャを定義することです。

アップデート

あなたのコメントに基づくと、C#4.0では共変/反変ジェネリックを使用してあなたが望むことが可能であるように思われます。つまり、ジェネリックISomething<out object>はを受け取ることができますISomething<string>。問題はIList<T>、共変ジェネリックパラメーターを定義していないため、IList<string>forを渡してIList<object>も機能しないことです。

ただし、は、共変パラメータを定義するをIList<T>継承します。IEnumerable<out T>したがって、Exportメソッドがパラメータを受け取った場合params IEnumerable<object>[] data、必要なものを渡すことができる必要がありIList<T>ます。

于 2012-04-03T06:51:46.520 に答える
1
   public interface IBook {}

   public class ScienceBook : IBook {} 
   public class MathBook: IBook {}
   public class HistoryBook: IBook {}

    class Main()
    {
      List<IBook> hbook = new List<HistoryBook>();
      List<IBook> mbook = new List<MathBook>();
      List<IBook> sbook = new List<ScienceBook> ();

      public void Export(string FileName, List<IBook> Data)


    }
于 2012-04-03T06:53:47.783 に答える