Как ссылаться на параметры типа структуры в общем классе C #? - PullRequest
0 голосов
/ 18 июня 2019

Я хотел бы создать свою собственную реализацию INotifyCollectionChanged, но я хочу, чтобы наблюдаемая коллекция была словарем. Что-то вроде:

MyObservableDictionary<KeyValuePair<TKey, TValue>>

После прочтения этой статьи на MSDN об генериках кажется, что вы можете определить это как

public class MyObservableDictionary<T> : INotifyCollectionChanged where T : struct
{
  public event NotifyCollectionChangedEventHandler CollectionChanged;
}

но это

  1. не требует, чтобы структура имела тип KeyValuePair и
  2. Я не знаю, как ссылаться на TKey и TValue в классе.

Есть ли какое-нибудь решение для этого?

Ответы [ 2 ]

2 голосов
/ 18 июня 2019

Ну, у вас есть 2 общие параметры, пусть они будут TKey и TValue:

public class MyObservableDictionary<TKey, TValue> 

Ваш класс реализует два интерфейса :

  1. "Я хочу, чтобы ... коллекция была словарем " - IDictionary<TKey, TValue>
  2. «Я хотел бы создать собственную реализацию INotifyCollectionChanged»

Добавьте их:

public class MyObservableDictionary<TKey, TValue> 
  : IDictionary<TKey, TValue>, 
    INotifyCollectionChanged 

Наконец, если я вас правильно понял, вы хотите ограничить и TKey, и TValue только struct; Вы можете сделать это с помощью where:

 public class MyObservableDictionary<TKey, TValue> 
  : IDictionary<TKey, TValue>, 
    INotifyCollectionChanged 
  where TKey : struct
  where TValue : struct {
  //TODO: implementation here
}
0 голосов
/ 18 июня 2019

Вы ищете

MyObservableDictionairy<TKey, TValue> : INotifyCollectionChanged where TValue : struct

Затем вы можете обернуть ключ / значения в пары ключ / значение по мере их добавления или просто добавить сигнатуру метода добавления, например:

public void Add(KeyValuePair<TKey, TValue> value)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...