Дерево выражений, которое может представлять объект ИЛИ список этого объекта? - PullRequest
1 голос
/ 19 июля 2011
public returnType ReturnProperty<T>(Expression<Func<T, returnType>> property) where T : MyObject
{
  // Some code or something
}

Очевидно, что это не моя настоящая функция, но в основном я хочу иметь возможность выбрать либо объект MyObject, либо объект List<MyObject>. Чем я должен заменить returnType, чтобы это было возможно? Это вообще возможно? У меня есть альтернативы, кроме как сделать returnType be object?

Примечание: Кроме того, я не знал, какие метки поставить на этот вопрос, извините.

Редактировать: Кроме того, причина, по которой я должен быть в состоянии сделать то и другое, в том, что я хотел иметь массив из них или что-то в этом роде. Как Expression<Func<T, returnType>>[] properties. Может быть, это дает мне больше или меньше возможностей.

Ответы [ 2 ]

0 голосов
/ 28 февраля 2013

Короткий ответ: если вы не можете написать это как прямой код C #, вы не можете написать его как дерево выражений.

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

private static void ProcessItems(ItemCollection c) {}
ProcessItems(new Item());

// ...

class Item {}

class ItemCollection : List<Item>
{
    public static implicit operator ItemCollection(Item item)
    {
        return new ItemCollection {item};
    }
}
0 голосов
/ 19 июля 2011

Вы можете получить функцию возврата объекта.Объект - это что угодно, поэтому это может быть MyObject или List .Затем вы можете делать такие вещи:

object retval = ReturnProperty(...)
if (retval is MyObject)
{
}
else if (retval is IEnumerable<MyObject>)    // Works for List, array, etc.
{
}
...