C # Как конвертировать Poco в список <Poco>, не зная, какой Poco вы используете - PullRequest
1 голос
/ 29 июня 2011

У меня есть метод, который принимает любой POCO. Затем метод должен иметь возможность проверить, является ли POCO List<Poco>. Если это не список, его необходимо преобразовать в список.

Пример

MyCustomMethod(object input)
{
    // if !input is list
    // convert input to list
}

И я бы назвал это так

MyCustomMethod(Pocos.foo);
MyCustomMethod(Pocos.bar);

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

Какой самый простой способ подойти к этому?

EDIT:

Некоторые аргументы в пользу этого могут помочь. Я создаю приложение , а Ext.Data.Store требует, чтобы все данные JSON были в массиве.

Я создаю свой веб-сервис, используя , и у меня есть пользовательский JsonPResult. JsonPResult принимает любой объект и возвращает этот объект как JsonP. Если я отправляю список в JsonPResult, все подливается. Если я просто отправляю один объект, Sencha Touch рвет, пока я не помещу этот объект в массив.

Чтобы все было СУХОЙ, я бы хотел, чтобы JsonPResult проверял, является ли какой-либо объект списком, и выполнял работу, а не повторял себя в каждом контроллере.

1 Ответ

8 голосов
/ 29 июня 2011

Вы можете сделать безопасное приведение:

var list = obj as List<Poco>;
if (list != null)
   // It's a list and you now have a reference
else
    list = new List<Poco> { (Poco)obj };

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

public static IList<T> AsList<T>(this T item)
{
    var list = item as List<T>;
    if (list != null)
        return list;

    return new List<T>() { item };
}

И некоторые примеры:

string name = "Matt";
var list = name.AsList();

List<string> names= new List<string>() { "Matt" };
var list2 = names.AsList();

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

...