有没有办法在.NET(2.0)中使用反射调用重载方法.我有一个动态实例化从公共基类派生的类的应用程序.出于兼容性目的,此基类包含2个同名方法,一个包含参数,另一个不包含.我需要通过Invoke方法调用无参数方法.现在,我得到的只是一个错误告诉我,我正试图调用一个模棱两可的方法.
是的,我可以将对象转换为我的基类的实例并调用我需要的方法.最终会发生,但现在,内部并发症将无法实现.
任何帮助都会很棒!谢谢.
我想在JavaScript中编写自己的函数,它将一个回调方法作为参数并在完成后执行它,我不知道如何在我的方法中调用一个作为参数传递的方法.喜欢反思.
示例代码
function myfunction(param1, callbackfunction)
{
//do processing here
//how to invoke callbackfunction at this point?
}
//this is the function call to myfunction
myfunction("hello", function(){
//call back method implementation here
});
Run Code Online (Sandbox Code Playgroud) 我想调用一个私有静态方法.我有它的名字.我听说可以使用Java反射机制完成它.我该怎么做?
编辑:尝试调用方法时遇到的一个问题是如何指定其参数的类型.我的方法接收一个参数,其类型是Map.因此我做不到Map<User, String>.TYPE
(在运行时因为Java类型擦除而没有Map这样的东西).有没有其他方法来获得该方法?
哪个更正确,为什么?
Control.BeginInvoke(new Action(DoSomething), null);
private void DoSomething()
{
MessageBox.Show("What a great post");
}
Run Code Online (Sandbox Code Playgroud)
要么
Control.BeginInvoke((MethodInvoker) delegate {
MessageBox.Show("What a great post");
});
Run Code Online (Sandbox Code Playgroud)
我觉得我在做同样的事情,所以什么时候适合使用MethodInvoker
vs Action
,甚至写一个lambda表达式?
编辑:我知道写一个lambda vs之间并没有什么区别Action
,但MethodInvoker
似乎是出于特定目的.它有什么不同吗?
我使用带有可选参数的C#4.0遇到了另一个问题.
我如何调用一个函数(或者更确切地说是构造函数,我有ConstructorInfo
对象),我知道它不需要任何参数?
这是我现在使用的代码:
type.GetParameterlessConstructor()
.Invoke(BindingFlags.OptionalParamBinding |
BindingFlags.InvokeMethod |
BindingFlags.CreateInstance,
null,
new object[0],
CultureInfo.InvariantCulture);
Run Code Online (Sandbox Code Playgroud)
(我刚试过不同的BindingFlags
).
GetParameterlessConstructor
是我写的自定义扩展方法Type
.
我有一个命令列表(i,h,t等),用户将在命令行/终端Java程序中输入.我想存储一个命令/方法对的哈希:
'h', showHelp()
't', teleport()
Run Code Online (Sandbox Code Playgroud)
所以我可以使用类似的代码:
HashMap cmdList = new HashMap();
cmdList.put('h', showHelp());
if(!cmdList.containsKey('h'))
System.out.print("No such command.")
else
cmdList.getValue('h') // This should run showHelp().
Run Code Online (Sandbox Code Playgroud)
这可能吗?如果没有,这是一个简单的方法吗?
我知道,当从任何非UI线程操作UI控件时,您必须封送对UI线程的调用以避免问题.一般的共识是您应该使用测试InvokeRequired,如果为true,则使用.Invoke来执行封送处理.
这会导致很多代码看起来像这样:
private void UpdateSummary(string text)
{
if (this.InvokeRequired)
{
this.Invoke(new Action(() => UpdateSummary(text)));
}
else
{
summary.Text = text;
}
}
Run Code Online (Sandbox Code Playgroud)
我的问题是:我可以省略InvokeRequired测试并只调用Invoke,如下所示:
private void UpdateSummary(string text)
{
this.Invoke(new Action(() => summary.Text = text));
}
Run Code Online (Sandbox Code Playgroud)
这样做有问题吗?如果是这样,是否有更好的方法来保持InvokeRequired测试,而不必在整个地方复制和粘贴此模式?
我有这个小方法应该是线程安全的.一切正常,直到我希望它具有回报价值而不是虚空.如何在调用BeginInvoke时获得返回值?
public static string readControlText(Control varControl) {
if (varControl.InvokeRequired) {
varControl.BeginInvoke(new MethodInvoker(() => readControlText(varControl)));
} else {
string varText = varControl.Text;
return varText;
}
}
Run Code Online (Sandbox Code Playgroud)
编辑:我想在这种情况下让BeginInvoke不是nessecary,因为我需要来自GUI的值才能继续线程.所以使用Invoke也很好.只是不知道如何在以下示例中使用它来返回值.
private delegate string ControlTextRead(Control varControl);
public static string readControlText(Control varControl) {
if (varControl.InvokeRequired) {
varControl.Invoke(new ControlTextRead(readControlText), new object[] {varControl});
} else {
string varText = varControl.Text;
return varText;
}
}
Run Code Online (Sandbox Code Playgroud)
但不知道如何使用该代码获得价值;)
我已经看到了交叉线程访问GUI控件的常见设置,如下所述: 将线程安全访问方法写入Windows窗体控件的最短方法
我发现的所有网络点击描述了类似的事情.
但是,为什么我们需要检查InvokeRequired?我们不能直接调用Invoke吗?
我认为答案是否定的,所以我真正的问题是'为什么'?
我正在构建一个WPF应用程序.我正在与服务器端进行一些异步通信,我在客户端上使用Prism进行事件聚合.这两件事导致产生新的线程,而不是UI线程.如果我尝试在这些回调和事件处理程序线程上执行"WPF操作",那么世界将会崩溃,现在它已经开始了.
首先,我遇到了尝试在服务器回调中创建一些WPF对象的问题.我被告知线程需要在STA模式下运行.现在我正在尝试更新Prism事件处理程序中的一些UI数据,我被告知:
调用者无法访问此线程,因为另一个线程拥有它.
所以; 在WPF中解决问题的关键是什么?我在这篇MSDN帖子中读到了WPF Dispatcher .我开始明白了,但我还没有巫师.
有人想帮我清理一下吗?任何相关的建议等?谢谢!
invoke ×10
.net ×5
c# ×5
reflection ×3
java ×2
.net-2.0 ×1
begininvoke ×1
delegates ×1
dispatcher ×1
hash ×1
javascript ×1
methods ×1
overloading ×1
wpf ×1