如何为 lambda 表达式的参数列表声明类型?

How to declare Type for a params list of lambda expressions?

我正在尝试构建一种方法,该方法接受 lambda 表达式的 params 列表(,即 ,逗号分隔的列表)。

public void DoSomething<TDataType, ...>(params Expression<Func<TDataType, TNavProp>>[] properties)
{
    // ...
}

如何以允许多种不同类型的方式声明 TNavProp

例如...

public class Class1
{
    public int IntProp { get; set;}

    public string StringProp { get; set; }
}

DoSomething<Class1, int>(cl => cl.IntProp);    // this compiles
DoSomething<Class1, ?>(cl => cl.IntProp, cl => cl.StringProp);    // this won't compile

是声明多个 DoSomething 重载的唯一解决方案吗?

在方法里面,我其实只想记录PropertyInfo(我什至会满足于属性这个名字,作为最后的手段),那么有没有更简单的方法来实现它?

在你的情况下,因为你只需要与每个表达式相关的 PropertyInfo,而不关心 return 类型,你可以使用 object 作为你的 TReturn:

public static void DoSomething<TDataType>(
    params Expression<Func<TDataType, object>>[] properties)

现在这是有效的,因为每个 lambda 都可以转换成 Expression<Func<Class1, object>>:

DoSomething<Class1>(cl => cl.IntProp, cl => cl.StringProp);