2013-09-28 3 views
0

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

public interface IMyClass<in TA, in TB> 
{ 
    bool MyMethod<TX, TY>(TX argumentX, TY argumentY); 
} 

public class MyClass<TA, TB> : IMyClass<TA, TB> 
{ 
    public bool MyMethod<TX, TY>(TX argumentX, IEnumerable<TY> argumentsY) 
    { 
     // DO STUFF 
    } 
} 

Типы TX и TY предназначены для представления TA и TB, но должны быть взаимозаменяемыми (поэтому я не мог использовать TA и TB в методе без дублирования кода). Вот как должны функционировать ограничения:

  • TX должен быть того же типа, что и TA или TB.
  • TY должен быть того же типа, что и TA или TB.
  • Если TX - это тот же тип, что и TA, TY должен быть того же типа, что и TB (и v.v.).

Есть ли способ обеспечить соблюдение этого во время разработки с использованием общих ограничений или я должен его реализовать с использованием исключений для отказа во время выполнения?

ответ

0

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

+0

Я боялся этого. Возможно, мне придется придерживаться другого подхода. Чтобы ответить на ваш вопрос, я хотел бы назвать этот метод двумя разными способами (A, B и B, A) без дублирования кода или для создания экземпляра объекта дважды с помощью инвертированных типов. – yelxe

0

Непосредственно, но вы можете решить эту проблему с помощью двух перегруженных методов.

public class MyClass<TA, TB> : IMyClass<TA, TB> 
{ 
    public bool MyMethod(TA argumentX, TB argumentY) 
    { 
     string argX = SpecialPreFormatterForTA(argumentX); 
     string argY = SpecialPreFormatterForTB(argumentY); 
     return MyMethodCommon(argX, argY); 
    } 

    public bool MyMethod(TB argumentX, TA argumentY) 
    { 
     string argX = SpecialPreFormatterForTB(argumentX); 
     string argY = SpecialPreFormatterForTA(argumentY); 
     return MyMethodCommon(argX, argY); 
    } 

    private bool MyMethodCommon(string argX, string argY) 
    { 
     // DO STUFF 
    } 
} 

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

+0

Когда я упрощал код для этого вопроса, я допустил ошибку - второй аргумент метода представляет собой коллекцию (см. Править). Мне нужно итерации через аргументыY (и нужно иметь возможность делать это как с типом TA, так и с типом TB). Я мог бы перегрузить метод, но нет кода, который можно извлечь в общий метод (это уже сделано). Я как бы застрял между правилом «Не повторяй себя» и чистым, понятным кодом. – yelxe

+0

@yelxe есть общая база или интерфейс, которые реализуются как TA, так и TB? Проблема разрешима, если она есть. –

+0

Одним из типов будет объект модели ORM, а другой будет объектом передачи данных WCF. Единственный элемент, который я могу считать общим между ними, - ObjId. Если я настрою абстрактный класс или интерфейс для всех моделей и DTO, это не будет ограничивать использование конкретной модели и DTO, которые я указываю во время использования. – yelxe

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