3

我的问题有点类似于 不允许通用接口的通用列表,还有其他方法吗?

如果我有一个界面,例如

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

4 回答 4

4

您可以利用动态

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

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

于 2012-08-08T04:50:01.540 回答
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.

于 2012-08-08T04:48:30.360 回答
2

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

基本上你的界面失败了。它不是“通用接口” 更像是“相似接口”

如果您不想进行强制转换,那么您将必须找到它们共同的接口。

于 2012-08-08T04:40:22.787 回答
0

您可以将Value属性移动到基本接口。

public interface IPrimitive
{
     object Value { get; }
}

您想如何value在具有不同类型的循环中进行处理?

于 2012-08-08T04:47:39.137 回答