将表达式传递给初始化程序

3

我可以将表示变量的表达式传递给实例化对象时使用。

不需要这样:

class MyObject : IMyInterface { ... }

var list = db.MyObjects.Where(x => !x.IsDeleted).ToList();
var anotherList = list.Select(x => new AnotherObject() { 
  Id = x.Id,
  Value = x.Value
});

我希望能够将一个IMyInterface对象列表转换为另一种类型的列表(以AnotherObject为例),并使用定义好的表达式进行转换,具体如下:
var list = db.MyObjects
  .Where(x => !x.IsDeleted)
  .ToAnotherObjectList(x => x.Id, x => x.Value);

...

public static List<AnotherObject> ToAnotherObjectList<T>(
  this IEnumerable<IMyInterface> list, 
  Expression id, 
  Expression value)
{
    return list.Select(x => new AnotherObject() { Id = id, Value = value }).ToList();
}

我不确定如何实现这个。我知道可以使用反射来创建对象并通过字符串设置属性,但我不知道如何传递表达式。

更新

好吧,我以为我需要进行一些反射操作,但它比我想象的要简单。以下是在现实生活中有效的解决方案。

public static IEnumerable<AnotherObject> ToAnotherObject<T>(this IEnumerable<T> list, Func<T, int> getId, Func<T, string> getValue, Func<T, bool> getSelected = null) where T : IMyInterface
{
    return list.Select(x => new AnotherObject {
        Display = getValue(x),
        Id = getId(x),
        Selected = getSelected != null && getSelected(x),
    });
}
1个回答

2
您可以使用Func<TInput,TReturn>来实现此功能。例如:
public static List<AnotherObject> ToAnotherObjectList<T>(
  this IEnumerable<T> list, 
  Func<T, int> getId,
  Func<T, object> getValue)
{
    return list.Select(x => new AnotherObject() { Id = getId(x), Value = getValue(x) }).ToList();
}

呼叫:

list.ToAnotherObjectList(i => i.Id, i=> i.Value);

在这个例子中,我使用了一个参数(类型为T)和返回类型为int/object的Funcs。最初的回答。

嗯,我以为会比那更复杂。这进一步澄清了事情。谢谢,这对我有用。我还更新了顶部,非常接近我实际使用的方式,同时通过 where T : IMyIntefaceT 进行了限制。 - Paul Carlton

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接