Можно ли получить доступ к нескольким интерфейсам в словаре одного интерфейса? - PullRequest
0 голосов
/ 04 июля 2019

Прежде всего: извините, если вопрос странно сформулирован. Я новичок в мультиклассе в 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 ]

1 голос
/ 04 июля 2019

Когда вы создаете 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 ... 
}

Это проверит, реализует ли элемент указанный интерфейс, и только затем получит доступ к элементу (свойству) этого интерфейса

0 голосов
/ 04 июля 2019

Если я правильно понимаю ваш вопрос, эта строка

class ItemType1 : IStandardProperties, IItemType1

объявляет ItemType1 как реализующий IStandardProperties и IItemType1, что означает, что он имеет обе черты.

Ваша декларация о питании

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

говорит, что ваш словарь набирается от int до IStandardProperties. Это означает, что значение словаря известно и принудительно имеет тип IStandardProperties. Однако это не говорит о том, насколько возможны черты вашей ценности.

Следовательно, вы должны запрашивать определенную черту, когда вам это нужно (обратите внимание, что в C # 7 есть ярлыки, которых я специально избегал):

IStandardProperties v; 
if (items.TryGetValue("key", out v))
{
    // found. the line below asks if the interface is supported
    var item1 = v as IItemType1;
    if (item1 != null)
    {
        // v supports IItemType1, therefore you can do something with it, by using item1
    }

    // we repeat for IItemType2
    var item2 = v as IItemType2;
    if (item2 != null)
    {
        // v supports IItemType2, therefore you can do something with it, by using item2
    }

}
else
{
    // not found
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...