如何为 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);
我正在尝试构建一种方法,该方法接受 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);