Универсальный словарь со значением в качестве интерфейса с общей ссылкой

#c# #.net #generics

#c# #.net #общие термины

Вопрос:

Я хочу иметь словарь, в котором значения являются универсальными объектами и не будут одинаковыми для каждого значения в словаре. Как это можно сделать, я чувствую, что мне не хватает чего-то простого.

НАПРИМЕР

 
    public interface IMyMainInterface
    {
        Dictionary<string, IMyInterface<T>> Parameters { get; }
    }

    public interface IMyInterface<T>
    {
        T Value
        {
            get;
            set;
        }

        void SomeFunction();
    }

Result:
dic.Add("key1", new MyVal<string>());
dic.Add("key2", new MyVal<int>());

  

Ответ №1:

Вы не можете этого сделать, потому что T не имеет смысла в IMyMainInterface . Если ваша цель состоит в том, чтобы каждое значение было реализацией некоторого IMyInterface<T> , но каждое значение могло быть реализацией для другого T , то вам, вероятно, следует объявить базовый интерфейс:

 public interface IMyInterface
{
    void SomeFunction();
}

public interface IMyInterface<T> : IMyInterface
{
    T Value { get; set; }
}
  

затем:

 public interface IMyMainInterface
{
    Dictionary<string, IMyInterface> Parameters { get; }
}
  

РЕДАКТИРОВАТЬ: Учитывая ваш обновленный вопрос, похоже, что это то, что вы пытаетесь сделать. Если вы хотите знать, почему вам приходится это делать, подумайте о том, как бы вы попытались использовать значения в словаре, если бы вы могли использовать свой исходный код. Представьте:

 var pair = dictionary.First();
var value = pair.Value;
  

Какой тип можно value определить как?


Однако, если каждое значение должно быть одинаковым T , то вам просто нужно сделать ваш другой интерфейс тоже универсальным. Чтобы было понятнее, я переименовал параметр type, чтобы сохранить Ts отдельными:

 public interface IMyMainInterface<TFoo>
{
    Dictionary<string, IMyInterface<TFoo>> Parameters { get; }
}
  

Комментарии:

1. Если я выберу этот маршрут, чтобы извлечь значение из словаря, мне пришлось бы привести его к типу. т.е. MyDict[«ключ»].Значение. Значение (Да, неправильная терминология)

2. @Sytone: Да. В любом случае это абсолютно необходимо, потому что в противном случае вы могли бы попытаться извлечь значение для «key2» в виде строки вместо int… как компилятор мог узнать, что вы хотели?