2012-06-08 69 views
3

經過近20年的使用Visual FoxPro,我正在遭受強大的類型語言。 :)。轉換列表<SomeObject>轉至列表<T>?

我試圖創建一個通用的方法,使用一個接口來設置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#: An instance of type 'System.Collections.Generic.List' can not be returned by a method of type '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>(); 

我應該怎麼做,使其工作?

回答

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(); 
    } 
} 

這是正常的模式之一。

+0

一分鐘....試試吧! –

+0

太棒了! .....只有一個錯字(我認爲)。 public List GetAll(){...} /// GetAll和()之間沒有,right ??? ... 謝謝! –

+0

哦,我已經解決了答案。 –

1

傑弗裏的答案是正確的,但它聽起來就像你實際上是試圖使用泛型

Have a look here更多的信息來實現存儲庫模式 - 你可能試圖重新發明輪子。

+0

謝謝! ...我現在就讀它! –

+0

嘿...它真的會幫助我! CRUD就是我的觀點!再次感謝你! –

+0

@RodolfoDuarte非常歡迎 – Basic