c#如何实现泛型集合

时间:2010-04-22 23:57:41

标签: c# generics interface

我有一个工作类,可以处理一组对象。我需要每个对象都有两个属性,一个属性未知,一个必须是数字。

我想使用一个接口,这样我就可以拥有多个允许其他属性的项目类,但却被迫拥有了工人类所需的PropA和PropB。

这是我到目前为止的代码,在我尝试使用它之前似乎没问题。即使MyItem实现了IItem,也不允许将MyItem列表作为IItem列表传递。这是我感到困惑的地方。

另外,如果可能的话,如果在实例化工作者类时我不需要传入T,那么它会很好,相反它会根据PropA的类型知道T是什么。

有人可以帮我解决一下吗? 谢谢!

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
}

1 个答案:

答案 0 :(得分:3)

如果直接提供界面而不是具体类型,则可以使此工作正常。它只是无法为您进行隐式转换:

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

暂且不说:您的原始代码实际上适用于C#4,它支持IEnumerable<T>上的covariance。但是之前版本的C#没有,这就是你得到错误的原因。