可以表示对象的表达式树还是该对象的列表?

时间:2011-07-19 17:17:14

标签: c# lambda expression-trees

public returnType ReturnProperty<T>(Expression<Func<T, returnType>> property) where T : MyObject
{
  // Some code or something
}

显然这不是我的实际功能,但基本上我想要的是能够选择MyObject的对象或List<MyObject>的对象。为了实现这一点,我应该用returnType替换什么?有可能吗?除了returnType object之外,我还有其他选择吗?

注意:另外,我不知道在这个问题上放什么标签,抱歉。

编辑:此外,我需要能够做到这两点的原因是我想要他们的数组或其他东西。像Expression<Func<T, returnType>>[] properties一样。也许这给了我更多或更少的选择。

2 个答案:

答案 0 :(得分:0)

您可以拥有函数返回对象。对象是任何东西,所以它可以是MyObject或List&lt; MyObject&gt;。然后你可以做这样的事情:

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

答案 1 :(得分:0)

简短的回答是,如果你不能把它写成直接的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};
    }
}