2015-06-03 5 views
7

Я использую приведенный ниже код. Он предназначен для определенного типа, чтобы ограничить это всплывающий-Несс в IntelliSense и т.д.Метод расширения для двух разных типов

public static Generic Get<Generic>(this Entity input) 
{ 
    return (Generic)input; 
} 

Теперь я хотел бы использовать те же Получить метод для другого типа (или, быть полностью покрыт, несколько другими типы, но все еще количество исправлений). Поэтому я добавил второй метод, и код выглядит следующим образом.

public static Generic Get<Generic>(this Entity input) 
{ 
    return (Generic)input; 
} 

public static Generic Get<Generic>(this Entity2 input) 
{ 
    return (Generic)input; 
} 

Это мне кажется, что лучше было бы, чтобы держать его в том же теле метода и до сих пор охватывают все расценены типы. Существует ли синтаксис для включения, например, два подписи подписи? Что-то вроде этого псевдо-код ниже.

public static Generic Get<Generic>(this [Entity, Entity2] input) 
{ 
    return (Generic)input; 
} 

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

public static Generic Get<Generic>(this Entity input) 
{ 
    return CommonLogic(input); 
} 

public static Generic Get<Generic>(this Entity2 input) 
{ 
    return CommonLogic(input); 
} 

private static Generic CommonLogic(Object input) 
{ 
    return (Generic)input; 
} 
+0

Я бы поехал с последним подходом точно или положил его на объект? –

+1

Есть ли что-нибудь общее между 'Entity' и' Entity2'? –

+6

Вы контролируете источник классов EntityX? Если это так, вы можете создать маркер (пустой) интерфейс и использовать только те классы, которые реализуют интерфейс. Затем введите тип этого «метода расширения» этого интерфейса. – user469104

ответ

5

C# не поддерживает [Entity, Entity2] обозначения, так что вариант выходит.

Если Entity и Entity2 имеют общий интерфейс или базового класса, а затем объявить его как:

public static Generic Get<Generic>(this IEntityCommon input) 
{ 
    return (Generic)input; 
} 

Если нет, и вы создали Entity, Entity2 и т.д., а затем добавить общий интерфейс. Этот интерфейс не должен определять какие-либо методы и может быть пустым, он просто предоставляет общий тип для метода расширения.

Несоблюдение всех этих требований, способ «CommonLogic» - ваш лучший вариант.

+0

Обозначение было всего лишь псевдокодом, чтобы сократить объяснение. Классы не разделяют общий интерфейс, предназначенный только для них, и поскольку логика очень короткая, я думаю, нет смысла прилагать усилия, чтобы сделать все правильно. Однако это полезно знать в общем случае. –

3

вы могли бы сделать что-то вроде этого

public static TSearch Get<TSource, TSearch>(this TSource obj) where TSource : BaseType, ISomeInterface 
    { 

    } 

T теперь может быть только типа BaseType и реализации ISomeInterface, но это не сделало бы его Ивеко быть ограничено кол починки поддерживаемых классов

EDIT:

теперь вы можете использовать это на объектах типа BaseType реализующих ISomeInterface и RETU rn Запрошенный тип TSearch. Однако вы также можете использовать where TSource : ISomeInterface. Подсказка в том, что ваши классы Entity реализуют этот интерфейс.

Проверьте, пожалуйста, where - generic type constratint, чтобы использовать его.

+1

Для этого вам понадобятся два общих типа. Вход и выход. Прямо сейчас это берет что-то определенного типа и возвращает тот же самый тип, который не является кодом OPs. – juharr

+0

@juharr теперь должен соответствовать (если его классы «Entity» являются типами «BaseType» и «ISomeInterface») – LuckyLikey

+1

Вы должны указать 'TSource' как общий тип метода' public static TSearch Get (этот TSource obj) ' – juharr

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