繁体   English   中英

C#如何实现泛型集合

[英]c# How to implement a collection of generics

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

我想使用一个接口,以便可以有多个项目类,这些项目类允许其他属性,但被迫拥有工作人员类所需的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
}

如果您直接提供接口而不是具体类型,则可以使这项工作有效。 它只是无法为您做隐式转换:

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

顺便说一句:您的原始代码实际上可以在C#4中运行,它支持IEnumerable<T>上的协方差 但是以前的C#版本没有,这就是为什么会出现错误。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM