使用Lambda Expression作为参数

时间:2014-08-04 11:36:09

标签: c#

我读了一段代码并感到困惑。它来自一个类的方法:

public ResponseType Cancel(RequestType request)
{
    return Processor.Execute<RequestType , ResponseType>(
        context =>
        {
            Services.Cancel(Convertor.ToBusiness(request,  context.GetUid()));
        },
        request);
}

首先,我不知道如何传入Lambda Expression中的 context 。我的意思是,上下文的来源。 取消(RequestType请求)方法的参数列表未提供它。 Processor类将Execute实现提供为:

public static class Processor
{
   public static TResponse Execute<TRequest, TResponse>(ProcessProc proc, TRequest request)
          where TRequest : class
          where TResponse : class{......}

   //Processor::ProcessProc is a delegate:
   public delegate object ProcessProc(ServiceContext context); 
}

其次,我不知道在哪里TRequest:class 的好处,我检查了msdn文件, where-class 是为了确保TRequest是参考类型,是吗?

感谢Alex。虽然还有些不明白的地方: 对于,其中TRequest:class :如果我正在编写这段代码,我将不会注意添加此 where-class 。如果传入了错误类型的参数,编译器会抱怨我相信。那么使用它的意义是什么?
似乎上下文隐藏在某些我还不知道的地方。我验证了类的Processor的定义,它没有从任何其他类继承,只包含几个方法和两个委托定义,没有其他数据或属性。代码可以编译并成功运行。我怀疑引入Lambda-ex作为参数的可读性。理解哪一个应该被用作 context 的参数,编译器如何解决它是不明确的? 以下是我在msdn上找到的示例: EX1:

delegate int del(int i);
static void Main(string[] args)
{
    del myDelegate = x => x * x;
    int j = myDelegate(5); //x=5, easy to understand
}

EX2:

int[] numbers = { 5, 4, 1, 3, 9, 8, 6, 7, 2, 0 };
int oddNumbers = numbers.Count(n => n % 2 == 1);

ex2与ex1不是直截了当的,对于从c ++转移的我来说,可读性稍差。

已添加:上下文是否有可能来自 RequestType请求 RequestType 是一个非常大且部分的类,不容易找到完整的定义。

我发现上下文最后被分配到 ProcessProc 的工厂实现中非常深的地方,执行了委托并且上下文获得价值。我没有深入挖掘代表是如何被执行的。所以这个线程没什么价值。在没有看到所有代码的情况下,任何人都几乎不可能猜到答案。无论如何,非常感谢。

2 个答案:

答案 0 :(得分:0)

你是对的,类意味着你不能使用值类型(结构)作为通用参数。 Context是变量的,它在lambda中被关闭,并且是参数,在他的实现中执行用来调用你的lambda。这意味着,Execute接受lambda并在某个对象上使用它,并在类Processor中封装。我认为,处理器存储了一些业务上下文,并且您执行将取消与您的某些请求参数相关联的上下文(GUID思想)。

答案 1 :(得分:0)

为了更清楚一下Processor类的静态Execute函数的第一个参数,您可以看到参数类型ProcessProc是一个委托,它接受一个ServiceContext并返回一个对象。您可以通过多种方式将委托传递给此类代码。第一个也可以说是最常用的形式是在类中定义一个与委托签名匹配的方法,然后将该函数作为第一个参数传递,如:

public object MyProcessProc(ServiceContext context)
{
  // Do something
  return null;
}

第二种方法如示例所示,将匿名委托(lambda)作为第一个参数传递给函数。在这种情况下,lambda语法规定委托的参数应在&#34; =&gt;&#34;的左侧指定。但不一定必须命名相同。开发人员可以像委托一样轻松使用以下内容:

purple =>
{
  Services.Cancel(Convertor.ToBusiness(request,  purple.GetUid()));
}

虽然可读性会受到影响。

希望这有助于解决问题。