集合项目上的Memberexpression

时间:2013-10-30 10:39:17

标签: c# .net linq lambda

我目前正在努力在集合中的项目上使用memberexpression完成一个方法。 我知道如何编写一个直接保存集合成员的memberexpression但是如何告诉它使用它的基础类型。

private Collection<TestClass> collection { get; set; }
DoSomethingWithCollection(collection, () => collection.Count);

private void DoSomethingWithCollection(Collection<TestClass> collection, MemberExpression member)
{
    foreach(var item in collection)
    {
        //use reflexion to get the property for each item 
        //based on the memberexpression and work with it
    }
}

我怎么需要重写这个代码,DoSomethingWithCollection的调用可以保存集合的基础类型的Memberexpression,所以从“TestClass”?

2 个答案:

答案 0 :(得分:3)

您可以使用泛型来更轻松有效地实现这一目标:

private void DoSomethingWithCollection<TClass, TProperty>(
    Collection<TClass> collection,
    Func<TClass, TProperty> extractProperty)
{
    foreach (var item in collection)
    {
        var value = extractProperty(item);
    }
}

以下是您如何使用它(考虑到您的收藏品具有“名称”属性):

DoSomethingWithCollection(collection, item => item.Name);

答案 1 :(得分:1)

在您的评论中,您也询问了如何设置属性。也许你真正想要的是一个更通用的解决方案,比如ForEach运算符,它对集合中的每个元素执行一些操作:

public static void ForEach<TSource>(
    this IEnumerable<TSource> source,
    Action<TSource> action)
{
    if (source == null)
        throw new ArgumentNullException("source");
    if (action== null)
        throw new ArgumentNullException("action");

    foreach (TSource item in source)
        action(item);
}

现在你可以阅读一个属性:

items.ForEach(item => Console.WriteLine(item.Name));

...或设置属性:

items.ForEach(item => item.Name = item.Name.ToUpper());

......或做其他事情:

items.ForEach(item => SaveToDatabase(item));

您可以自己编写此扩展方法,但它也是Interactive Extensions的一部分,它扩展了LINQ以及Reactive Extensions中的一些功能。只需在NuGet上寻找“Ix Experimental”包。