是否可以在一个接口的字典中访问多个接口?

时间:2019-07-04 12:29:09

标签: c# interface multiple-inheritance

首先,对不起,如果问题措辞奇怪。我对使用C#进行多重分类是不熟悉的,因此有些困惑。

我目前正在建立一个库存系统,该系统对所有物品使用一个字典。这些项本身属于不同的类,并且使用接口作为属性。为了简单起见,假设这些是接口。一个接口具有名称,第二个接口具有特定的值,第三个接口具有另一个特定的值。

我似乎无法弄清楚如何(如果可能)访问第二个界面的属性,因为我得到的唯一建议就是字典中使用的项目类型。

// the interface examples
interface IStandardProperties
{
   string Name { get; set; } 
}

interface IItemType1
{ 
    int SomeValue { get; set; } 
}

interface IItemType2
{ 
    int AnotherValue { get; set; } 
}

// Then we have two classes that uses these. 
class ItemType1 : IStandardProperties, IItemType1
{ 
    public string Name; 
    public int SomeValue;
    public ItemType1() 
    {
       this.Name = "Item type 1"; this.SomeValue = "10";
    }
}

class ItemType2 : IStandardProperties, IItemtype2
{
    public string Name; 
    public int SomeValue;
    public ItemType1() 
    { 
        this.Name = "Item type 1"; 
        this.AnotherValue = "100";
    }
}

// and finally the dictionary in question.

Dictionary<int, IStandardProperties> items = New Dictionary<int, IStandardProperties>();

现在,这两个项目都可以存储在字典中,但是我似乎无法弄清楚如何(或如果可能)通过字典访问存储在SomeValue和AnotherValue的接口属性中的值。我已经看到了几个使用“ as InterfaceName”的示例,但是我不确定它的用法。

是否可以访问这些文件? (以防万一我在接口方面犯了严重错误,这些值是否甚至存储在字典中?

我绝不是专家,所以我很乐意在此问题上提供任何纠正或帮助。

2 个答案:

答案 0 :(得分:1)

在创建Dictionary<int, IStandardProperties>时,我们唯一可以确定的是每个项目都实现了该特定接口。

如果您要询问类型为AnotherValue的项的ItemType1属性,那么您显然将做不正确的事情。这就是为什么字典项无法显示此属性的原因:它们不是字典中每个元素的属性

一种可以实现所需功能的方法是键入检查:

if (items[0] is IItemType1) {
    (items[0] as IItemType1).SomeValue ... 
} 
if (items[0] is IItemType2) {
    (items[0] as IItemType2).AnotherValue ... 
}

这将检查项目是否实现了所述接口,然后才访问该接口的成员(属性)

答案 1 :(得分:0)

如果我正确理解了您的问题,请输入此行

(2%10, NET30)

class ItemType1 : IStandardProperties, IItemType1 声明为实现ItemType1IStandardProperties,这意味着它具有两者特征。

您的惯用声明

IItemType1

表示您的字典是从Dictionary<int, IStandardProperties> items = New Dictionary<int, IStandardProperties>(); int键入的。这意味着已知强制类型的字典的值为IStandardProperties。 但是,这并不能说明您的价值可能具有的特征。

因此,您必须在需要时要求特定的特征(请注意,从C#7开始,有一些快捷方式,我有意避免了这种方式):

IStandardProperties