gpt4 book ai didi

c# - 传递用于访问属性的 Lambda 表达式列表

转载 作者:行者123 更新时间:2023-11-30 21:41:20 25 4
gpt4 key购买 nike

我今天有一个静态函数,我传递一个属性表达式并从中创建一个字符串:

public static string SomeFunction<TModel, TProperty>(TModel model, Expression<Func<TModel, TProperty>> expression){...}

我想将其更改为处理这样​​的表达式列表:

static string SomeFunctionForList<TModel, TProperty>(TModel model, List<Expression<Func<TModel, TProperty>>> expressions){...}

在第二种情况下,我将遍历表达式并执行我正在对它们执行的任何逻辑。

这就是我现在调用该函数的方式:

SomeFunction(this, m => m.nameOfProperty)

如何调用此函数并定义表达式列表?我正在尝试这个,但它不起作用:

SomeFunctionForList(this,
new List<Expression<Func<TModel, TProperty>>> {
{ m => m.nameOfProperty1},
{ m => m.nameOfProperty2}
});

我收到一个编译器错误,提示无法找到 TModel 和 TProperty。明确地说,这是在不同的文件中调用的。

最佳答案

您有通用方法 SomeFunctionForList具有通用类型参数 TModelTProperty .在第一种情况下,类型推断能够从方法调用的第一个和第二个参数中推断出这些参数的类型。这就是您可以跳过显式指定类型参数的原因。

但类型推断仅适用于泛型方法。它不适用于从构造函数参数推断类型参数。这就是为什么你应该指定 List<T>明确的通用参数。注意:您应该指定类型名称而不是通用参数。例如。如果TModelYourModel类,两个属性都有 string类型,那么方法调用应该如下所示:

SomeFunctionForList(this,
new List<Expression<Func<YourModel, string>>> {
{ m => m.nameOfProperty1},
{ m => m.nameOfProperty2}
});

所以,如果你想使用类型推断,列表构造函数的使用不是一个选项。您可以使用 params指定可变数量的参数(作为数组传递)并具有类型推断的好处:

public static string SomeFunction<TModel, TProperty>(
TModel model, params Expression<Func<TModel, TProperty>>[] expressions)

然后方法调用看起来像

SomeFunctionForList(this,
m => m.nameOfProperty1,
m => m.nameOfProperty2
);

请注意,属性应具有相同的类型。

关于c# - 传递用于访问属性的 Lambda 表达式列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43507545/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com