2013-03-15 3 views
1

Мое приложение имеет n-уровневую архитектуру. У меня разные уровни (Business Logic & Data Link & GUI). Я использую некоторые общие классы для передачи данных с одного слоя на другой. У меня есть класс (скажем RetrnValueCls), который имеет только две переменные Return value и Return Message. Пока я передаю данные с одного слоя на другой, мне нужно вернуть этот класс Return Value вместе с другим классом (скажем MasterItemsCls), который имеет другие переменные.В C#, возможно ли передать два разных класса в качестве возвращаемого типа из одного слоя в другой?

Ниже приведены методы

public MasterItemsCls GetMasterItemsMDL() 
{ 
    /* Does some computations and assign them to 
    attributes of MasterItemsCls and pass it other methods in other layers. */ 
} 

public ReturnValueCls GetMasterItemsMDL() 
{ 
    /* Does some computations and assign them to 
    attributes of ReturnValueCls and pass it other methods in other layers. */ 
} 

Я хочу вернуть обе вышеуказанные классы (MasterItemsCls & ReturnValueCls) в качестве типа возвращаемого значения для метода GetMasterItemsMDL сразу, а также я не хочу, чтобы объединить оба классы. Пожалуйста, дайте мне знать, если я могу это сделать.

ответ

7

Функция может возвращать только одно значение, поэтому в этом смысле ответ отрицательный.

Функции могут иметь параметры out, поэтому вы можете вернуть одно из двух значений через параметр out.

Самый чистый способ справиться с этим, на мой взгляд, состоит в том, чтобы использовать третий класс для хранения двух других. Tuple<T1,T2> может быть использован для этой цели:

public Tuple<MasterItemsCls, ReturnValueCls> MyFunction() 
{ 
    // Do stuff 
    return new 
    Tuple<MasterItemsCls, ReturnValueCls>(myMasterItemsCls, myReturnValueCls); 
} 

Одним из недостатков Tuple<T1,T2> является то, что эти значения доступны как довольно неинтуитивными Item1 и Item2.

Если вы не хотите использовать Tuple<T1,T2>, легко создать свой собственный класс, содержащий MasterItemsCls и ReturnValueCls. Это мой предпочтительный подход.

+1

+1 для обозначения того, как иногда нечитаемый код получается, если вы используете 'Tuple's в C#. Например, 'tuple.Item1 + tuple.Item2 - кортеж.Item3' удаляет читаемость –

+0

@IlyaIvanov: Кортежи могут быть удобными, но обычно я занимаю время, чтобы создать собственный класс по этой причине. –

+0

Согласитесь, субъективны, но я считаю, что Tuples - хороший способ интеграции частей, написанных в F # с кодом C#. F # имеет очень приличный механизм работы с Tuples, например, сопоставление шаблонов. Я попытался включить Tuples в проект, но не более двух общих параметров и очень-очень редко. –

6

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

public class YouClassName 
{ 
    public MasterItemsCls MasterItemsCls {get; set;} 
    public ReturnValueCls ReturnValueCls {get; set;} 
} 
0

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

0

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

Вы можете сделать следующее:

public ReturnValueCls<MasterItemsCls> GetMasterItemsMDL() 
{ 

} 

Ваш ReturnValueCls<T> ожидает параметр типа для возвращаемого типа. Таким образом, ваш тип retun может действовать как обертка для вашего желаемого возвращения и иметь возможность удерживать ваше сообщение возврата.


Пример определения вашего класса. Могут потребоваться некоторые ограничения:

public class ReturnValueCls<T> 
{ 
    public T Value { et; set;} 
    public string Message {get; set;} 
}