首先,对不起,如果问题措辞奇怪。我对使用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”的示例,但是我不确定它的用法。
是否可以访问这些文件? (以防万一我在接口方面犯了严重错误,这些值是否甚至存储在字典中?)
我绝不是专家,所以我很乐意在此问题上提供任何纠正或帮助。
答案 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
声明为实现ItemType1
和IStandardProperties
,这意味着它具有两者特征。
您的惯用声明
IItemType1
表示您的字典是从Dictionary<int, IStandardProperties> items = New Dictionary<int, IStandardProperties>();
到int
键入的。这意味着已知和强制类型的字典的值为IStandardProperties
。
但是,这并不能说明您的价值可能具有的特征。
因此,您必须在需要时要求特定的特征(请注意,从C#7开始,有一些快捷方式,我有意避免了这种方式):
IStandardProperties