2013-02-15 72 views
4

我有一个数据源,我不想绑定一个X的集合。 X应该包含某种类型的子集中,Y的属性(假设Y的性能PropOne,PropTwo,PropThree) 这当然可以用一个匿名类型来完成:以类型安全的方式使用另一个实例的属性子集创建一个实例?

void DoBind() 
{ 
    myGrid.DataSource = myCollectionOfYs.Select(y => new {y.PropOne, y.PropTwo}); 
} 

我怎么能修改此方法,以便它的调用者可以以类型安全的方式指定要在投影中使用哪些属性?即沿着线的东西:

var expressions = new List<Expression<Func<Y, object>>>(); 
expressions.Add(y => y.PropOne); 
expressions.Add(y => y.PropTwo); 
DoBind(expressions); 
+0

是否必须是完全动态的?或者你有N种可能的情况? – 2013-02-15 15:17:48

+0

那么在使用Func 时会出现问题吗? – 2013-02-15 15:23:51

+0

@Rui它应该是动态的,因为方法的用户应该完全自由地指定要包含在绑定数据中的任何属性,并且不应该被迫改变DoBind方法或其任何依赖关系。 – Christian 2013-02-15 15:25:26

回答

2

使用你的想法:

void DoBind(Func<Y, object> func) 
{ 
    myGrid.DataSource = myCollectionOfYs.Select(funct); 
} 

,并使用类似:

DoBind(y => new {y.PropOne}); 
+0

当然!我一直坚持认为你不能传递匿名类型,但是没有阻止传递返回一个函数的函数。 :) – Christian 2013-02-15 15:58:13

2

你能不能在选择功能传递给DoBind方法:

public static void DoBind<T, TResult>(ICollection<T> collection, Func<T,TResult> selector) 
{ 

    DataSource = collection.Select(selector) 
} 

,然后调用它像这样:

 DoBind(list, y => new { y.Prop1, y.Prop2 }); 
     DoBind(list, y => new { y.Prop3, y.Prop2 }); 
+0

或者'public void DoBind (ICollection collection,Func selector)' – 2013-02-15 15:29:58

+0

谢谢。与@adrianfaciu一样,他在上面的评论中提出了解决方案。 – Christian 2013-02-15 15:59:18

+0

是的,没问题。这始终是一场比赛。 – 2013-02-15 16:43:48

相关问题