2012-11-28 6 views
1

У меня есть класс, который содержит два набора данных.Тип Ограничения на Generics C# - Множественные ограничения

  1. Список значений для X.
  2. список значений для Y.

Теперь, X и Y может проводить либо строку/двойной/целое/DateTime в любой возможной комбинации. Единственным правилом является то, что в любой данный момент времени оба списка должны содержать равное количество значений.

Я мог решить проблему всегда иметь равные данные, предоставляя доступ только с помощью метода AddXY и метода RemoveAt (гарантируя, что в любой момент времени я могу гарантировать, что как X List, так и Y List равны по размеру).

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

someClassInstance.X [I] и someClassInstance.Y [I]

Поскольку нет возможности для этого в C#, я выбрал подвергая X и Y как метод IList (AsReadOnly).

Теперь я рассмотрел идею ограничения типов с помощью Generics. Но я не могу найти подходящие примеры для этого конкретного случая.

Как сказать

public class MyClass<P, Q> 
    where P : Double, String, Integer, DateTime 
    and Q : Double, String, Integer, DateTime 

Должен ли я отказаться от идеи в целом и посмотреть на какой-то кортежей или какой-то такой структуры данных?

EDIT: Я также знаю, что ограничения не могут быть типами значений, так как это работает?

+0

Проблема в том, что я не хочу создавать несколько классов для разных комбинаций. – Harsha

+0

Почему бы не использовать struct как ваше ограничение? –

+0

Как использовать kvp для заданного элемента, отличного от пользовательской коллекции или кортежа? –

ответ

4

То, о чем вы просите, невозможно в C#. Существует не общее ограничение типа, которое объединяет эти типы.

Лучшее, что вы можете сделать, это проверить во время выполнения, например, в статическом конструкторе. Что-то вроде этого:

public class MyClass<P, Q> 
{ 
    static MyClass() 
    { 
     if (IsValidType(typeof(P) 
      && IsValidType(typeof(Q)) 
     throw new NotSupportedException("invalid type for MyDataStructure"); 
    } 
    static bool IsValidType(Type type) 
    { 
     // logic to check whether type is acceptable 
     return true; 
    } 
} 

Однако я бы посоветовал это сделать, поскольку он кажется несколько искусственным.

+1

Замена этого на кодовый контракт и включение статической проверки может работать. –

+0

[Кодовые контракты] (http://research.microsoft.com/en-us/projects/contracts/) полезны! – Cornelius

Смежные вопросы