2010-04-22 52 views
0

我有一个工作的类与对象的集合的东西。我需要每个对象都有两个属性,一个是未知类型,一个是数字。c#如何实现一个泛型的集合

我想使用一个接口,以便我可以有多个项目类别允许其他属性但被强制拥有工作者类所需的PropA和PropB。

这是我到目前为止的代码,这似乎是确定的,直到我尝试使用它。 MyItem的列表不允许作为IItem的列表传递,尽管MyItem实现了IItem。这是我困惑的地方。另外,如果可能的话,如果在实例化工作者类时我不需要传入T,而是知道T是基于PropA的类型,那将是非常好的。

有人可以帮我整理一下吗? 谢谢!

public interface IItem<T> 
{ 
    T PropA { get; set; } 
    decimal PropB { get; set; } 
} 

public class MyItem : IItem<string> 
{ 
    public string PropA { get; set; } 
    public decimal PropB { get; set; } 
} 

public class WorkerClass<T> 
{ 
    private List<T> _list; 

    public WorkerClass(IEnumerable<IItem<T>> items) 
    { 
     doStuff(items); 
    } 
    public T ReturnAnItem() 
    { 
     return _list[0]; 
    } 
    private void doStuff(IEnumerable<IItem<T>> items) 
    { 
     foreach (IItem<T> item in items) 
     { 
      _list.Add(item.PropA); 
     } 
    } 
} 
public void usage() 
{ 
    IEnumerable<MyItem> list= GetItems(); 
    var worker = new WorkerClass<string>(list);//Not Allowed 
} 

回答

3

如果您直接提供接口而不是具体类型,则可以使此工作成为可能。它只是不能做隐式转换为您提供:

IEnumerable<IItem<string>> items = GetItems().Cast<IItem<string>>(); 
var worker = new WorkerClass<string>(items); 

在旁白:你原来的代码实际上在C#4,支持对IEnumerable<T>covariance工作。但以前版本的C#不会,这就是为什么你会得到错误。

+0

@Aaronaught:有趣的是,现在编程语言(至少在下一个版本中),使程序员的代码工作,程序员认为应该首先工作。喜欢他们在C#上所做的改进。我会阅读该协变 – Hao 2010-04-23 00:28:11

+0

这有效,谢谢!有没有更简单的方法来解决这个问题,还是我在正确的轨道上? – Amy 2010-04-23 04:52:19

+0

@Amy:很难说如果不真正了解'WorkerClass'是什么或者那些'Item'对象是什么。确定一个泛型类型/接口并进一步限制它是可以的;我一直这样做。 – Aaronaught 2010-04-23 13:29:48