如果我有两个变量:
Object obj;
String methodName = "getName";
Run Code Online (Sandbox Code Playgroud)
在不知道类的情况下obj
,如何调用其上标识的方法methodName
?
被调用的方法没有参数和String
返回值.它是Java bean的getter.
我有一个场景.(Windows Forms,C#,.NET)
UserControl_Load
方法,则UI在加载方法执行的持续时间内变得无响应.伪代码看起来像这样:
代码1
UserContrl1_LoadDataMethod()
{
if (textbox1.text == "MyName") // This gives exception
{
//Load data corresponding to "MyName".
//Populate a globale variable List<string> which will be binded to grid at some later stage.
}
}
Run Code Online (Sandbox Code Playgroud)
它给出的例外是
跨线程操作无效:从创建它的线程以外的线程访问控件.
为了更多地了解这一点,我做了一些谷歌搜索,并提出了一个建议,如使用下面的代码
代码2
UserContrl1_LoadDataMethod()
{
if (InvokeRequired) // Line #1
{
this.Invoke(new MethodInvoker(UserContrl1_LoadDataMethod));
return;
}
if (textbox1.text == "MyName") // Now it wont give an exception
{
//Load data correspondin to "MyName"
//Populate a globale …
Run Code Online (Sandbox Code Playgroud) 只是想知道BeginInvoke()
和之间的区别Invoke()
是什么?
主要是每个人将用于什么.
编辑:创建一个线程对象和调用invoke并只调用BeginInvoke()
一个委托有什么区别?或者他们是一样的吗?
好吧,我试图理解和阅读可能导致它的原因,但我无法得到它:
我在我的代码中有这个地方:
try{
..
m.invoke(testObject);
..
} catch(AssertionError e){
...
} catch(Exception e){
..
}
Run Code Online (Sandbox Code Playgroud)
事实是,当它试图调用某个方法时,它会抛出
InvocationTargetException
而不是其他预期的异常(具体而言ArrayIndexOutOfBoundsException
).因为我实际上知道调用了什么方法,所以我直接使用了这个方法代码,并为假设要抛出的行添加了一个try-catch块 ArrayIndexOutOfBoundsException
,它确实ArrayIndexOutOfBoundsException
按预期抛出.然而,当它上升时它以某种方式改变,InvocationTargetException
并且在上面的代码中,catch(Exception e)
e InvocationTargetException
并不ArrayIndexOutOfBoundsException
像预期的那样.
什么可能导致这样的行为或我如何检查这样的事情?
我试图通过参数反射调用方法,我得到:
对象与目标类型不匹配
如果我调用没有参数的方法,它可以正常工作.如果我调用该方法Test("TestNoParameters")
,则基于以下代码,它可以正常工作.但是,如果我打电话Test("Run")
,我会得到一个例外.我的代码有问题吗?
我最初的目的是传递一系列对象,例如public void Run(object[] options)
但这不起作用,我尝试了一些更简单的例如字符串而没有成功.
// Assembly1.dll
namespace TestAssembly
{
public class Main
{
public void Run(string parameters)
{
// Do something...
}
public void TestNoParameters()
{
// Do something...
}
}
}
// Executing Assembly.exe
public class TestReflection
{
public void Test(string methodName)
{
Assembly assembly = Assembly.LoadFile("...Assembly1.dll");
Type type = assembly.GetType("TestAssembly.Main");
if (type != null)
{
MethodInfo methodInfo = type.GetMethod(methodName);
if (methodInfo != null)
{
object result = null;
ParameterInfo[] …
Run Code Online (Sandbox Code Playgroud) 我想从微控制器发送温度值,使用UART到C#接口和显示温度开启Label.Content
.这是我的微控制器代码:
while(1) {
key_scan(); // get value of temp
if (Usart_Data_Ready())
{
while(temperature[i]!=0)
{
if(temperature[i]!=' ')
{
Usart_Write(temperature[i]);
Delay_ms(1000);
}
i = i + 1;
}
i =0;
Delay_ms(2000);
}
}
Run Code Online (Sandbox Code Playgroud)
我的C#代码是:
private void serialPort1_DataReceived(object sender, System.IO.Ports.SerialDataReceivedEventArgs e)
{
txt += serialPort1.ReadExisting().ToString();
textBox1.Text = txt.ToString();
}
Run Code Online (Sandbox Code Playgroud)
但是异常出现了" 跨线程操作无效:控制'textBox1'从一个线程访问,而不是在它创建的线程上 "请告诉我如何从我的微控制器获取温度字符串并删除此错误!
委托中的Invoke和DynamicInvoke有什么区别?请给我一些代码示例来解释这两种方法之间的区别.
任何人都可以解释这个链接上写的这个声明
Invoke(Delegate):
Run Code Online (Sandbox Code Playgroud)
在拥有控件的基础窗口句柄的线程上执行指定的委托.
任何人都可以解释这意味着什么(尤其是大胆的)我无法清楚地理解它
我可以动态调用方法名称为字符串的对象方法吗?我会想象它是这样的:
var FooClass = function() {
this.smile = function() {};
}
var method = "smile";
var foo = new FooClass();
// I want to run smile on the foo instance.
foo.{mysterious code}(); // being executed as foo.smile();
Run Code Online (Sandbox Code Playgroud) 我很好奇直接调用Func和使用Invoke()之间的区别.有区别吗?是第一个,语法糖,并在下面调用Invoke()?
public T DoWork<T>(Func<T> method)
{
return (T)method.Invoke();
}
Run Code Online (Sandbox Code Playgroud)
VS
public T DoWork<T>(Func<T> method)
{
return (T)method();
}
Run Code Online (Sandbox Code Playgroud)
或者我完全走错了轨道:)谢谢.
invoke ×10
c# ×7
reflection ×3
.net ×2
delegates ×2
java ×2
methods ×2
winforms ×2
begininvoke ×1
dynamic ×1
exception ×1
func ×1
javascript ×1
oop ×1
parameters ×1
uart ×1