c#具有通用项的接口列表

时间:2012-08-08 04:36:00

标签: c# list generics interface generic-list

我的问题有点类似 Generic List of Generic Interfaces not allowed, any alternative approaches?

如果我有一个界面,如

public interface IPrimitive
{

}

public interface IPrimitive<T> : IPrimitive
{
     T Value { get; }
}

public class Star : IPrimitive<string> //must declare T here
{
    public string Value { get { return "foobar"; } }
}

public class Sun : IPrimitive<int>
{
    public int Value { get { return 0; } }
}

然后我有一个清单

var myList = new List<IPrimitive>();
myList.Add(new Star());
myList.Add(new Sun());

循环浏览此列表时,如何获取Value属性?

foreach (var item in myList)
{
    var value = item.Value; // Value is not defined in IPrimitive so it doesn't know what it is
}

我不确定这是怎么可能的。

谢谢, 罗布

4 个答案:

答案 0 :(得分:4)

您可以利用 dynamic

foreach (dynamic item in myList) 
{ 
    var value = item.Value; 
} 
  

动态类型使其发生的操作可以绕过编译时类型检查。相反,这些操作在运行时解决

答案 1 :(得分:3)

你可以这样做:

public interface IPrimitive
{
    object Value { get; }
}

public interface IPrimitive<T> : IPrimitive
{
    new T Value { get; }
}

public class Star : IPrimitive<string> //must declare T here
{
    public string Value { get { return "foobar"; } }
    object IPrimitive.Value { get { return this.Value; } }
}

public class Sun : IPrimitive<int>
{
    public int Value { get { return 0; } }
    object IPrimitive.Value { get { return this.Value; } }
}

当您只有IPrimitive时,您就可以将值作为对象获取。

答案 2 :(得分:2)

当然不是,你的价值将是不同类型.....所以你必须向下转向真实类型以获得不同的价值。

基本上你的界面失败了。它不是“一个共同的界面”它更像是一个“类似的界面”

如果您不想进行投射,那么您必须找到两个共同的界面。

答案 3 :(得分:0)

您可以将Value属性移动到基本界面。

public interface IPrimitive
{
     object Value { get; }
}

你想如何在它有不同类型的循环中导出value