2011-07-19 34 views
1
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。也许这给了我更多或更少的选择。

+3

呃,在预感上,不,不可能返回一个代表对象实例或其泛型枚举等价物的类型。对于它的价值,可以考虑返回IEnumerable ,如果只返回一个元素,那么对于johnny g的建议,这是一个集合1. –

+0

+1;通过使用“new MyObject [] {item}”将单个项目变成该项目的IEnumerable是非常容易的“ –

+0

”这适用于返回类型,但在Expression中呢? – OpticalDelusion

回答

0

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

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

“除了使'returnType'成为'object''之外,我还有其他选择吗?”我的所有数据库对象都从一个类继承,我希望这个函数只接受来自这个类的对象(和对象列表)。 – OpticalDelusion

+0

不,因为MyObject和List 没有任何共同之处。一个不会从另一个继承,它们不共享任何接口,所以如果您愿意,“最小公分母”就是对象。 –

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}; 
    } 
} 
相关问题