Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/268.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 创建泛型(但在声明时键入)表达式数组_C#_.net_Lambda - Fatal编程技术网

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,
  };