#1和#2之间有什么区别:
代码1(编译好):
byte[] GetSomeBytes()
{
return (byte[])this.Invoke((MethodInvoker)delegate
{
GetBytes();
});
}
byte[] GetBytes()
{
GetBytesForm gbf = new GetBytesForm();
if(gbf.ShowDialog() == DialogResult.OK)
{
return gbf.Bytes;
}
else
return null;
}
Run Code Online (Sandbox Code Playgroud)
代码2(没有成功)
int GetCount()
{
return (int)this.Invoke((MethodInvoker)delegate
{
return 3;
});
}
Run Code Online (Sandbox Code Playgroud)
代码#2给了我,因为'System.Windows.Forms.MethodInvoker'返回void,返回关键字后面不能跟一个对象表达式.
我该如何解决?为什么(做)编译器认为代码#1是对的?
我有一个参数列表,我有方法名称.我想使用反射调用方法.当我检查Method.invoke的java文档时,它就像Method.invoke(object o,Object args ...).我知道第一个参数传递的内容(即实例方法调用哪个方法的实例)和args是方法的参数.
但是现在我有了包含要传递给方法的值的列表.
比如说:我想调用方法ClassName.methodName(String,int,int),我有一个包含{val1,3,4}的List.
使用反射可能类似于Method.invoke(classNameInstance,??????).但我不知道如何将参数列表转换为varargs并传递.
一种方法可能是如果我知道列表大小是3然后我可以编写Method.invoke(classNameInstance,list.get(0),list.get(1),list.get(2)).
但是我想动态调用的一些方法需要0到12个参数.所以创建switch case并编写12个案例看起来并不"好".每个都将检查参数的数量,并使用参数构建单独的调用.
除了使用开关盒外,还有什么方法可以解决这个问题?
任何帮助将不胜感激.
编辑
确定,这里的反馈非常好,让我指出了正确的方向.用于调用匿名闭包的用例位于Scalatra路由层中.我有一堆在不同类型下组合在一起的路由,在本例中,是团队共同的请求:
class Router {
type TeamType <: _Controller with _Team
get("""(schedules|rosters|teamresults|teamstats)/\d{8}""".r) {
val clazz :: date = captures
val obj = (clazz match {
case "schedules" => new RosterController
case "rosters" => new ScheduleController
}).asInstanceOf[TeamType]
obj.show(date)
}
}
Run Code Online (Sandbox Code Playgroud)
通过将匹配表达式包装在一个自调用的匿名闭包中,我们避免在每个匹配的情况下添加"FooController.asInstanceOf [TeamType]",而是在返回的实例上执行类型转换,在过程中保持不变性(即不能" val obj = clazz match {...}"后跟类型cast as obj已经被val'd了)
我相信这是在基于字符串类名创建对象实例时可以获得的短格式.当然,这样说,可能有一种FP方法可以更加简洁地完成工作......
无论如何,很酷的东西,从Groovy缺少匿名闭包,现在我发现Scala也包括在内;-)
原始
不知道如何在Scala中解决这个问题.在Groovy中,您可以定义和调用匿名闭包,如下所示:
{String s-> println(s) }("hello")
Run Code Online (Sandbox Code Playgroud)
Scala中的等价物是什么?而且,如何指定返回类型而不是返回Unit?
谢谢
[AttributeUsage(AttributeTargets.Method,AllowMultiple=true)]
public class MethodId : Attribute
{
private int mId;
public MethodId(int mId)
{
this.mId = mId;
}
public int methodId
{
get { return this.mId; }
set { this.mId = value; }
}
}
Run Code Online (Sandbox Code Playgroud)
public class Methods
{
[MethodId(1)]
public void square()
{ }
[MethodId(2)]
public void Notify()
{ }
}
Run Code Online (Sandbox Code Playgroud)
如何在MethodId的帮助下访问main()或任何其他类中的square()?
如何使用Emgu cv CvInvoke.cvLoadImage(...)从特定文件夹加载图像?我试着这样做
IntPtr inputImage = CvInvoke.cvLoadImage("C:\\Users\\...\\ClassPic1.jpg");
Run Code Online (Sandbox Code Playgroud)
这可以吗?如果是这样,我将如何作为Emgu.CV.Image文件访问它,以便我将对其进行图像处理?
我有一个带有按钮,标签和进度条的表单,因此当我单击该按钮时,它会创建一个b类实例来运行一个进程.一旦完成该过程,它将调用EventHandler在主窗体的标签中显示"done"!
我创建了一个委托事件(SetStatusEvent)来执行此操作.当我在EventHandler(usbforProcessExited)之外调用此事件时似乎很好但是当我从usbforProcessExited调用它时它会出错 -
object reference not set to an instance of an object
Run Code Online (Sandbox Code Playgroud)
主要形式
public partial class main : Form
{
b rsSet = new b();
public main()
{
InitializeComponent();
rsSet.SetStatusEvent += new RemoteS.SetStatus(updateStatus);
}
private void button1_Click(object sender, EventArgs e)
{
rsSet.FormatUSB();
}
private delegate void UpdateStatus(int i, string str, Color clr);
private void SetStatus(int i, string str, Color clr)
{
this.progressBar1.Value = i;
this.lbl_status.ForeColor = clr;
this.lbl_status.Text = str;
}
private void updateStatus(int i, String msg, Color color) …Run Code Online (Sandbox Code Playgroud) 在开发winform应用程序时,通常只需调用以获取主GUI线程来完成GUI工作.
Invoke今天已经过时了(如果我读的正确),相反你应该使用SynchronizationContext相反的.
问题是:我如何处理异常?我注意到有时在"同步/调用"线程上抛出的异常会丢失?
我确实使用了Application.ThreadException,AppDomain.CurrentDomain.UnhandledException但这没有用?
我需要完成以下场景.ThreadMethod()是一个Timer方法,我在Invoke语句中有UI更新.我需要等到Invoke完成它的工作,然后继续该方法.我怎么能应付这个?
public void ThreadMethod(){
//do some work
this.Invoke((MethodInvoker)delegate
{
//do some GUI update
});
//wait till Invoke finish its work
}
Run Code Online (Sandbox Code Playgroud) 我有一个AWS Lambda函数,需要~30秒.当我将其连接到API网关时,由于5秒超时,它正在发送504.所以我的easyCron工作失败了,不会再试一次(我只有一个免费的计划)
所以我需要一个API,它发送一个正确的200状态.我的想法:
通过短期lambda调用长期lambda.该策略允许调用.
这是代码
var AWS = require('aws-sdk'),
params = {
FunctionName: 'cctv',
InvocationType: 'RequestResponse',
LogType: 'Tail'
},
lambda;
AWS.config.update({region: 'us-east-1'});
lambda = new AWS.Lambda();
exports.handler = function (event, context) {
'use strict';
lambda.invoke(params, function (err, data) {
if (err) {
console.log(err, err.stack);
}
else {
console.log(data);
}
});
context.succeed('hey cron job, I think my lambda function is not called');
};Run Code Online (Sandbox Code Playgroud)
但我认为,context.succeed()中止了执行lambda.invoke()
你知道如何解决这个问题吗?
考虑来自WinForms应用程序的此代码示例:
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void button1_Click(object sender, EventArgs e)
{
object[] parms = new object[1];
parms[0] = "foo";
DoSomething(parms);
}
public static string DoSomething(object[] parms)
{
Console.WriteLine("Something good happened");
return null;
}
}
Run Code Online (Sandbox Code Playgroud)
它按预期工作,当您单击button1时,它会向控制台输出"Something good occurred".
现在考虑这个代码示例,除了它DoSomething使用反射调用之外是相同的:
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void button1_Click(object sender, EventArgs e)
{
object[] parms = new object[1];
parms[0] = "foo";
System.Reflection.MethodInfo mi …Run Code Online (Sandbox Code Playgroud)