Как написать универсальный класс / метод в C # 2.0, чтобы вернуть список объектов или просто строку, основанную на условии? - PullRequest
0 голосов
/ 24 февраля 2011

У меня есть веб-сервис, в котором есть метод, который возвращает объекты списка платежей, снабженные некоторыми входными параметрами. Однако, если входные параметры не в правильном формате, я хотел бы вернуть сообщение об ошибке, имеющее тип string, а не объекты List of Payment. Я хотел бы сделать это, используя концепцию универсальных классов в C #. У кого-нибудь есть идеи о том, как мне это удается?

Большое спасибо,

Вот код:

[WebMethod]
        public List<Payment> GetPayments(string firstDate, string lastDate, string entegrationStatus)
        {
            if (Common.IsDateTime(firstDate) && Common.IsDateTime(firstDate) && Common.IsValidEntegrationStatus(entegrationStatus))
            {
                return paymentManager.GetPayments(firstDate, lastDate, entegrationStatus);
            }
            else
            {
                return "ERROR MESSAGE";
            }
        }

Ответы [ 4 ]

2 голосов
/ 24 февраля 2011

Я вполне уверен, что все, что вам нужно сделать, это вызвать исключение в вашем методе обслуживания. Это заполнит свойство Error аргументов асинхронного события, которые возвращаются обратно клиенту. С помощью этого свойства клиент может проверять наличие ошибок в своем обработчике «завершено асинхронно» и обрабатывать его соответствующим образом.

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

Это так же просто, как:

Редактировать - Используя размещенный вами код:

[WebMethod]
    public List<Payment> GetPayments(string firstDate, string lastDate, string entegrationStatus)
    {
        if (Common.IsDateTime(firstDate) && Common.IsDateTime(firstDate) && Common.IsValidEntegrationStatus(entegrationStatus))
        {
            return paymentManager.GetPayments(firstDate, lastDate, entegrationStatus);
        }
        else
        {
            throw new ArgumentException("Your error message.");
        }
    }
0 голосов
/ 24 февраля 2011

хорошо, вы могли бы сделать что-то просто, например, иметь свойство ErrorString для вашего объекта, и если ваш основной метод завершился неудачей, установите ErrorString и вернуть null из вашего метода

SomeObject o = new SomeOject();
ILIst<Things> things = o.GetThings();
if(things == null)
  Response.Write(o.ErrorString)
0 голосов
/ 24 февраля 2011

Если вы действительно хотите это сделать, вы можете использовать класс, подобный Tuple (они представили Tuples в C # 4.0). Если вы используете C # 2.0, то вы можете использовать KeyValuePair<List<YourObject>, string>. Знайте, что я НЕ предлагаю вам сделать это! Вы должны сгенерировать исключение или поместить строковое сообщение в качестве параметра out.

0 голосов
/ 24 февраля 2011

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

Обычный подход заключается в использовании параметра out для вашего списка и вашей строки, и ваш метод возвращает bool, указывающий, был ли возвращен список. Эти методы обычно имеют префикс Try.... например,

bool TryGetList<T>(out IList<T> lst, out string Error) {
    if (!somcondition) {
        Error = "err!";
        return false;
    }
    lst = ...
    return true;
}

Другой метод состоит в простом использовании исключений, но они могут быть более дорогостоящими, если вы, вероятно, часто будете иметь ошибки. Например, ArgumentException позволит вам указать, какой аргумент был недействительным, и вызывающий объект может проверить ParamName перехваченного исключения, чтобы решить, что ему делать дальше.

...