小编Dar*_*ien的帖子

Lambda表达式<T,Func <TIN,TOUT >>和MethodInfo

在将项目从VS2010迁移到VS2012时,我遇到了以下问题.该项目使用了很多反射,为了从接口获取MethodInfo,放置了以下代码:

Expression<Func<ITest, Func<ServiceRequest, ServiceResponse>>> expression = scv => scv.Get;

UnaryExpression unaryExpression = expression.Body as UnaryExpression;

MethodCallExpression methodCallExpression = unaryExpression.Operand as MethodCallExpression;

ConstantExpression constantExpression = methodCallExpression.Arguments[2] as ConstantExpression;

MethodInfo myMethod = constantExpression.Value as MethodInfo;
Run Code Online (Sandbox Code Playgroud)

使用VS2010编译时效果很好,但是如果使用针对.Net 4.0的VS2012编译代码,则methodCallExpression.Arguments.Count()为2.

反编译后,我注意到编译器为同一个表达式生成了不同的代码.

这是一个设计问题,因为设计不应该像methodCallExpression.Arguments [2]中的数字2那样继续传递"幻数".我尝试使用以下方法找到解决方案:

MethodCallExpression outermostExpression = expression .Body as MethodCallExpression;
MethodInfo myMethod = outermostExpression.Method;
Run Code Online (Sandbox Code Playgroud)

但是outermostExpression为null.

最后,我让它改变了表达式如下:

Expression<Func<ITest, ServiceResponse>> expression = scv => scv.Get(default(ServiceRequest));
MethodCallExpression outermostExpression = expression.Body as MethodCallExpression;
Assert.AreEqual("Get", outermostExpression.Method.Name);
Run Code Online (Sandbox Code Playgroud)

它并不理想,但它适用于VS2010和VS2012.

有没有办法从如下表达式中找到MethodInfo:

Expression<Func<ITest, ServiceResponse>> expression = scv => scv.Get(default(ServiceRequest));
MethodInfo methodInfo = GetInnerMethodInfo( expression …
Run Code Online (Sandbox Code Playgroud)

c# reflection lambda methodinfo visual-studio-2012

8
推荐指数
1
解决办法
1727
查看次数

如何使用play json将具有单个值的json转换为case类

我有问题找到如何将带有单个值的json doc转换为case类.这是json:

{
  "ax" : {
           "bx" : "value1",
           "by" : "value2
         }
}
Run Code Online (Sandbox Code Playgroud)

以下是案例类:

case class B(bx: String, by: String)
case class A(ax: B)
Run Code Online (Sandbox Code Playgroud)

以下是阅读:

import play.api.libs.json._
import play.api.libs.json.Reads._
import play.api.libs.functional.syntax._

object Implicits {
     implicit val bReads: Reads[B] = (
        ( __ \ "bx" ).read[String] ~
        ( __ \ "by" ).read[String]
     ) ( B.apply _ )    

     implicit val aReads: Reads[A] = (
        ( __ \ "ax" ).read[B]
     ) ( A.apply _ )
}
Run Code Online (Sandbox Code Playgroud)

第二个隐式不会使用以下错误进行编译:

Error:(X, Y) overloaded method value …
Run Code Online (Sandbox Code Playgroud)

scala playframework playframework-2.3

2
推荐指数
1
解决办法
1274
查看次数

云运行无服务器事件

Cloud Run与Knative的“服务”(HTTP)功能有关。是否有计划实施“事件”功能?有一个用于“事件”的PubSub源,但是它需要在我们管理的k8s集群上运行。

google-cloud-platform serverless google-cloud-run

2
推荐指数
1
解决办法
216
查看次数