C# 接受表达式的泛型列表的泛型方法<;Func>;

C# 接受表达式的泛型列表的泛型方法<;Func>;,c#,generics,generic-programming,generic-list,C#,Generics,Generic Programming,Generic List,我已经声明了这些变量中的多个,但是如何才能将它们放入一个通用列表中呢 Expression<Func<poco, string>> fieldToUpdate1 = x => x.Name; Expression<Func<poco, bool>> fieldToUpdate2 = x => x.Id; Expression fieldToUpdate1=x=>x.Name; 表达式fieldToUpdate2=x=>x.Id; 目

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

Expression<Func<poco, string>> fieldToUpdate1 = x => x.Name;
Expression<Func<poco, bool>> fieldToUpdate2 = x => x.Id;
Expression fieldToUpdate1=x=>x.Name;
表达式fieldToUpdate2=x=>x.Id;
目前,我只能为泛型列表指定一种类型

所以我可以得到一个
列表
列表
。但不是两者都有。我希望能够有一个同时接受这两个参数的通用列表,以便可以将该列表作为参数传递

用例: 我试图做的用例是为Mongo方法updateOne创建一个通用包装器。签名如下。我想创建一个接受两个参数的通用包装器。我可以使用这些参数调用实际的mongo实现。大概是这样的:

GenericWrapper(Expression<Func<TDocument, bool>> filter, List<(Expression<Func<TDocument, TField>> expression, TField actual value)>)
GenericWrapper(表达式过滤器,列表)
问题是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
Expression fieldToUpdate1=x=>x.name;
表达式fieldToUpdate2=x=>x.testScore;
var表达式=新列表();
var item1=(表达式:fieldToUpdate2,值:4);
var item2=(表达式:fieldToUpdate1,值:“test”);
增加(第1项);
//我无法添加item2,因为它的类型不同。我只能传递相同类型的列表。我的泛型包装函数只接受一种类型的列表

public static UpdateResult UpdateOne(
这是我的收藏,
表达式过滤器,
更新定义更新,
UpdateOptions=null,
CancellationToken CancellationToken=null
)


关于如何制作这个通用包装器有什么想法吗?

您可以使用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);
Expression fieldToUpdate1=x=>x.Name;
表达式fieldToUpdate2=x=>x.Id;
List testList=新列表();
testList.Add(fieldToUpdate1);
testList.Add(fieldToUpdate2);

无论如何,一般的设计似乎有点奇怪,因为最后,您必须至少转换结果。

您可以使用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);
Expression fieldToUpdate1=x=>x.Name;
表达式fieldToUpdate2=x=>x.Id;
List testList=新列表();
testList.Add(fieldToUpdate1);
testList.Add(fieldToUpdate2);
总之,总体设计似乎有点奇怪,因为最后,您必须至少转换结果。

因为
表达式
继承自
表达式
,您可以将其放入
列表

List expressions=newlist();
表达式。添加(fieldToUpdate1);
表达式。添加(fieldToUpdate2);
由于
表达式
继承自
表达式
,因此可以将其放入
列表

List expressions=newlist();
表达式。添加(fieldToUpdate1);
表达式。添加(fieldToUpdate2);

您可以指定
object
作为列表类型,并在以后阅读列表时强制转换。退一步问自己:“我为什么需要这样一个wierd东西?”也很有用。也许你会得到一个更合理的设计。你将不得不瞄准钥匙<当您要传递特定参数时,code>Key1和
Key2
。您可以在要传入的w/e中循环,然后在将其添加到键之前检查类型。“但是,我如何才能将它们放入通用列表中?”您到底想在列表中放入什么<代码>字段更新1和
字段更新2
?还是要将
Func
的返回值放入列表中?对不起(这对我的大脑来说可能太早了),但我很困惑,这个问题对我来说并不清楚。这听起来也有点像XY问题。您可以发布一个使用
fieldToUpdate1
的用例吗?您可以指定
object
作为列表类型,并在以后阅读列表时强制转换。退一步问自己:“我为什么需要这样一个wierd东西?”也很有用。也许你会得到一个更合理的设计。你将不得不瞄准钥匙<当您要传递特定参数时,code>Key1和
Key2
。您可以在要传入的w/e中循环,然后在将其添加到键之前检查类型。“但是,我如何才能将它们放入通用列表中?”您到底想在列表中放入什么<代码>字段更新1和
字段更新2
?还是要将
Func
的返回值放入列表中?对不起(这对我的大脑来说可能太早了),但我很困惑,这个问题对我来说并不清楚。这听起来也有点像XY问题。您可以发布一个使用
fieldToUpdate1
的用例吗?Matthias的答案也可以,甚至不需要您的poco对象。Matthias的答案也可以,甚至不需要您的poco对象。由于他的表达式是Expression类型,他可以使用
LambdaExpression
,而不是
Expression
以确保至少只提供lambda表达式作为参数。由于他的表达式是Expression类型,他可以使用
LambdaExpression
而不是
Expression
以确保至少只提供lambda表达式作为参数。
List<Expression> expressions = new List<Expression>();
expressions.Add(fieldToUpdate1);
expressions.Add(fieldToUpdate2);