我目前正在努力在集合中的项目上使用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”?
答案 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”包。