我的问题有点类似 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
}
我不确定这是怎么可能的。
谢谢, 罗布
答案 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
?