2012-06-08 66 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