0

我目前正在努力在集合中的项目上使用成员表达式来完成一种方法。我知道如何编写一个直接持有集合成员的成员表达式,但我如何告诉它使用它的基础类型。

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”?

4

2 回答 2

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);
于 2013-10-30T10:58:56.533 回答
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 的一部分,它使用 Reactive Extensions 的几个功能扩展 LINQ。只需在 NuGet 上查找“Ix Experimental”包。

于 2013-10-30T11:40:06.863 回答