我有一个工作类,可以处理一组对象。我需要每个对象都有两个属性,一个属性未知,一个必须是数字。
我想使用一个接口,这样我就可以拥有多个允许其他属性的项目类,但却被迫拥有了工人类所需的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
}
答案 0 :(得分:3)
如果直接提供界面而不是具体类型,则可以使此工作正常。它只是无法为您进行隐式转换:
IEnumerable<IItem<string>> items = GetItems().Cast<IItem<string>>();
var worker = new WorkerClass<string>(items);
暂且不说:您的原始代码实际上适用于C#4,它支持IEnumerable<T>
上的covariance。但是之前版本的C#没有,这就是你得到错误的原因。