C# 以类型安全的方式使用另一个实例的属性子集创建实例?

C# 以类型安全的方式使用另一个实例的属性子集创建实例?,c#,C#,我有一个不想绑定X集合的数据源。X应该包含某个类型Y的属性的子集(假设Y有PropOne、PropTwo、proptwree属性) 当然,这可以通过匿名类型完成: void DoBind() { myGrid.DataSource = myCollectionOfYs.Select(y => new {y.PropOne, y.PropTwo}); } 如何修改此方法,使其调用方能够以类型安全的方式指定要在投影中使用的属性?也就是说,沿着这条路线: var expressions

我有一个不想绑定X集合的数据源。X应该包含某个类型Y的属性的子集(假设Y有PropOne、PropTwo、proptwree属性) 当然,这可以通过匿名类型完成:

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);
var表达式=新列表();
Add(y=>y.PropOne);
Add(y=>y.PropTwo);
DoBind(表达式);

您不能将选择器功能传递给DoBind方法:

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

    DataSource = collection.Select(selector)
}
利用你的想法:

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

它必须是完全动态的吗?或者您有N种可能的情况吗?那么使用Func有问题吗?@Rui它应该是动态的,因为该方法的用户应该完全自由地指定要包含在绑定数据中的任何属性,并且不应该被迫更改DoBind方法或其任何依赖项。@AdrianFaciu这是什么意思?DoBind的实现应该是什么样子?或者
public void DoBind(ICollection collection,Func selector)
谢谢。与@adrianfaciu在上面的评论中提出的解决方案相同。是的,没问题。这总是一场比赛,当然!我一直认为不能传递匿名类型,但没有什么可以阻止传递返回类型的函数。:)
void DoBind(Func<Y, object> func)
{
    myGrid.DataSource = myCollectionOfYs.Select(funct);
}
DoBind(y => new {y.PropOne});