3

Visual FoxPro を 20 年近く使用して以来、強い型言語に悩まされています。:)。

プロパティを設定するために、1 つのインターフェイスを使用してジェネリック メソッドを作成しようとしていDataGrid.ItemsSourceます。

どうぞ...

まず、クラス (POCO) があります。

public class PersonVO
{
    public int PersonID { get; set; }
    public string Name { get; set; }
}

次に、インターフェイスを作成しました。

public interface IBussiness
{
    List<T> GetAll<T>();
}

そして、このインターフェースを実装する他のクラス...

public class PersonBLL : IBussiness
{
    public List<PersonVO> CreateNewList()
    {
        List<PersonVO> list = new List<PersonVO>();
        list.Add(new PersonVO() { PersonID = 1, Name = "Robert" });
        list.Add(new PersonVO() { PersonID = 2, Name = "Julie" });
        list.Add(new PersonVO() { PersonID = 3, Name = "Bernard" });
        return list;
    }

    public List<T> GetAll<T>()
    {
        return CreateNewList();
    }
}

ステートメントreturn CreateNewList()にエラーが表示されます。

C#: タイプ 'System.Collections.Generic.List' のインスタンスは、タイプ 'System.Collections.Generic.List' のメソッドによって返すことはできません

そこで、この方法を次のように変更しました。

public List<T> GetAll<T>()
{
    return CreateNewList() as List<T>;
}

コンパイルされます!

さて、私の問題が始まります... WPF usercontrol がありMyTabItemListます。

私のポイントは、実行時に新しい WPF TabItem を作成し、BLL クラスを挿入することです (この例PersonBLLでは、実際にはたくさんあります...)。

MyTabItemList myTabItem = new MyTabItemList(new PersonBLL());

MyTabItemList は次のようなものです。

public partial class MyTabItemList : TabItem
{
    IBussiness oBLL;
    public MyTabItemList(IBussiness oBLL)
    {
        InitializeComponent();
        this.oBLL = oBLL;
        MyGrid.ItemsSource = oBLL.GetAll<object>();
    }
}

正常に動作しますが、希望どおりに動作しません。

oBLL.GetAll<object>()常に戻りますnull

(以下のように)に変更<object>する<PersonBLL>と機能しますが、この場合はクラスMyTabItemListでのみ機能しPersonBLLます:

MyGrid.ItemsSource = oBLL.GetAll<PersonBLL>();

機能させるにはどうすればよいですか?

4

2 に答える 2

6

このように、ジェネリックでないコンポーネントからジェネリック リストを返したいのはなぜですか?

public interface IBussiness
{
    List<T> GetAll<T>();
}

あなたの目的は次のとおりだと思います:

public interface IBussiness<T>
{
    List<T> GetAll();
}

PersonBLLそして実装を行いますIBussiness<PersonVO>

public class PersonBLL : IBussiness<PersonVO>
{
    public List<PersonVO> CreateNewList() { ... }

    public List<PersonVO> GetAll()
    {
        return CreateNewList();
    }
}

よくあるパターンの一つです。

于 2012-06-08T02:20:48.027 に答える
1

ジェフリーの答えは正しいですが、ジェネリックを使用して実際にリポジトリパターンを実装しようとしているようです

詳細については、こちらをご覧ください。車輪の再発明を試みている可能性があります。

于 2012-06-08T02:25:58.867 に答える