2009-05-19 2 views
3

В приведенном ниже коде «где T: WsgTypes.RouteRestriction», я могу добавить несколько классов, так что T может быть только те несколько типов классов, которые я заинтересован вОбобщения C# .net

public static T GetDetails<T>(string code) where T : WsgTypes.RouteRestriction 
    { 
     T details; 
     if (typeof(T) == typeof(WsgTypes.TicketType)) 
     { 
      details = TicketTypeDetail.GetDetails(code) as T; 

     } 
     else if (typeof(T) == typeof(WsgTypes.RouteRestriction)) 
     { 
      details = RouteRestrictionDetail.GetDetails(code) as T; 

     } 
     else 
     { 
      throw new NotSupportedException(""); 
     } 
     return details; 
     throw new NotImplementedException(); 
    } 
+0

Это не то, для чего были разработаны общие методы. Если у вас есть только несколько возможностей, тогда не используйте общий метод в первую очередь. Если существует только три возможных типа, напишите три разных метода. Дженерики были разработаны для тех случаев, когда тип действительно общий - где это может быть любое неограниченное количество типов. –

ответ

1

Для наследования вы можете иметь один класс с несколькими интерфейсами.

public static T GetDetails<T>(string code) where T : WsgTypes.RouteRestriction, , IComparable 
    { 
    } 

Вместо этого вы можете иметь интерфейс и иметь несколько классов, реализующих его.

public interface IInterface 
    {} 

    public class Class1: IInterface 
    {} 

    public class Class2: IInterface 
    {} 

public static T GetDetails<T>(string code) where T:IInterface 
     { 
      T instance; 
      // ... 
      return instance; 
     } 
1

I» боюсь, вы не можете. Обычный способ - предоставить общий интерфейс, который все классы, которые вас интересуют, реализуют. Проблема заключается в том, что внутри общего тела компилятор ожидает, что параметр универсального типа будет однозначным.

Ну, или вы можете взять объект в качестве параметра и бросить его по своему желанию. Но нет. Не.

Обратите внимание, что вместо typeof вы также можете использовать операторы и as.

1

Смотрите эту статью ...

http://msdn.microsoft.com/en-us/library/d5x73970.aspx

... для получения дополнительной информации о constaints. Вы можете добавить несколько ограничений, и вы можете ограничить каким-то интерфейсом или некоторым базовым классом, но не списком произвольных классов.

Вот пример из множества ограничений (из указанных выше):

class Base { } 
class Test<T, U> 
    where U : struct 
    where T : Base, new() { } 
+0

В этой статье объясняется, как использовать несколько ограничений для одного и того же типа - т. Е. Общий параметр должен реализовать ВСЕ из них. – OregonGhost

+0

В вашем примере объясняются различные ограничения для разных аргументов типа - это, вероятно, не то, что хочет Мираль. – OregonGhost

+0

Yep - неверный вопрос. Редактирование сейчас ... –

0

Пробовали ли вы отделяя их, как это:

public static T GetDetails<T>(string code) where T : WsgTypes.RouteRestriction, NextClass, AnotherClass, AndSoOn 
{ 
... 
} 
+0

это невозможно – Miral

4

Нет, общие ограничения типа можно указать только один базовый-класс.

Вы можете указать несколько интерфейсов, но это «все», а не «любое».

То, что вы просите, возможно при перегрузке, но не с дженериками.

5

Мне кажется, что это не правильное использование дженериков. Было бы лучше, если бы TicketType и RouteRestriction реализовали около IDetailed.

+0

Да, это подробная версия того, что я описал в общем :) – OregonGhost

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