C# 创建泛型(但在声明时键入)表达式数组
这就是我努力实现的目标:C# 创建泛型(但在声明时键入)表达式数组,c#,.net,lambda,C#,.net,Lambda,这就是我努力实现的目标: public static Expression<Func<object, object>>[] Expressions() => new Expression<Func<object, object>>[] { (Type1 t1) => t1.t1Field, (Type2 t2) => t2.t2Field,
public static Expression<Func<object, object>>[] Expressions()
=> new Expression<Func<object, object>>[]
{
(Type1 t1) => t1.t1Field,
(Type2 t2) => t2.t2Field,
...
(TypeN tN) => tN.tNField
};
返回类型是接受对象和返回对象的lambda数组。但是返回一个lambda数组,每个lambda都接受某个用户类型。所以最简单的方法是添加类型转换:
public static Expression<Func<object, object>>[] Expressions()
=> new Expression<Func<object, object>>[]
{
(Object o) => ((Type1)o).t1Field,
(Object o) => ((Type2)o).t2Field,
};
公共静态表达式[]表达式()
=>新表达式[]
{
(对象o)=>((类型1)o).t1字段,
(对象o)=>((类型2)o).t2字段,
};
您不能使用一个代表列表吗?依赖静态类型的Func
假定您在编译时知道这些类型。您似乎希望在运行时提供corect类型。除此之外,即使您可以将不同的表达式存储到单个列表中,您将如何编译它们并调用相应的委托?它们只是Func
类型,允许将Type2
的实例也传递给第一个元素。@HimBromBeere最终目标是以后通过memberExpr.ToString()
将属性名提取为字符串。我没有足够的经验知道这是否能与代表一起工作。这是完美的,我没有想到这个解决方案!谢谢它甚至可以简化为(o)=>((Type1)o).t1Field
,从数组声明中推断出第一个对象
。如果调用其中一个委托,这种方法是危险的,例如表达式[0]。Compile()(instanceOfType2)
将导致无效的CastException
。因此,使用Func
不会获得任何类型的安全性。这就是为什么我在上面添加了我的评论。
public static Expression<Func<object, object>>[] Expressions()
=> new Expression<Func<object, object>>[]
{
(Object o) => ((Type1)o).t1Field,
(Object o) => ((Type2)o).t2Field,
};