接受Expression <func>的通用列表的通用方法

时间:2018-08-22 06:57:38

标签: c# generics generic-programming generic-list

我已经声明了多个这些变量,但是如何将它们放入通用列表中?

Expression<Func<poco, string>> fieldToUpdate1 = x => x.Name;
Expression<Func<poco, bool>> fieldToUpdate2 = x => x.Id;

当前,我只能为通用列表指定一种类型。

所以我可以得到List<string>List<bool>。但不是两者。我希望能够有一个接受两者的通用列表,因此我可以将该列表作为参数传递。

用例: 我要使用的用例是为Mongo方法updateOne创建通用包装。带有以下签名。我想创建一个将接受两个参数的通用包装。我可以使用这些参数来调用实际的mongo实现。像这样:

GenericWrapper(Expression<Func<TDocument, bool>> filter, List<(Expression<Func<TDocument, TField>> expression, TField actual value)>)

问题在于TField只能是一种类型。所以我只能这样做:

Expression<Func<Student, string>> fieldToUpdate1 = x => x.name;
Expression<Func<Student, int>> fieldToUpdate2 = x => x.testScore;
var expressions = new List<(Expression<Func<Student, int>>    expression, int value)>();
var item1 = (expression: fieldToUpdate2, value: 4);
var item2 = (expression: fieldToUpdate1, value: "test");
expressions.Add(item1);
//I can't add item2 since its of a different type. I can only  pass a list of the same type. And my generic wrapper function will only accept a list of one type

http://api.mongodb.com/csharp/current/html/M_MongoDB_Driver_IMongoCollectionExtensions_UpdateOne__1.htm

public static UpdateResult UpdateOne<TDocument>(
this IMongoCollection<TDocument> collection,
Expression<Func<TDocument, bool>> filter,
UpdateDefinition<TDocument> update,
UpdateOptions options = null,
CancellationToken cancellationToken = null

关于如何制作通用包装的任何想法?

2 个答案:

答案 0 :(得分:2)

由于Expression<T>继承自Expression,因此您可以将其放入List<Expression>

List<Expression> expressions = new List<Expression>();
expressions.Add(fieldToUpdate1);
expressions.Add(fieldToUpdate2);

答案 1 :(得分:1)

您可以使用object作为返回值:

Expression<Func<poco, object>> fieldToUpdate1 = x => x.Name;
Expression<Func<poco, object>> fieldToUpdate2 = x => x.Id;
List<Expression<Func<poco, object>>> testList = new List<Expression<Func<poco, object>>>();
testList.Add(fieldToUpdate1);
testList.Add(fieldToUpdate2);

无论如何,总体设计似乎有些奇怪,因为最后必须至少转换结果。