我的项目是一个三层架构项目,与后端的WCF服务进行通信.当后端能够从服务获取数据时,它使用发布 - 订阅通知业务层,而后者通知GUI层.
我使用Visual Studios设计器为我的UI设计添加了一个OpenFileDialog.按钮事件处理程序调用ShowDialog消息.但是,一旦我单击按钮,整个UI就会挂起.
谷歌搜索了一下,我发现使用委托是处理这样的任务的首选方式.但是,无论是否有代表,问题仍然存在.
目前我的代码如下所示:
private void bOpen_Click(object sender, EventArgs e)
{
Func<Image> del = delegate
{
OpenFileDialog d = new OpenFileDialog();
if (d.ShowDialog() == DialogResult.OK)
{
return Image.FromFile(d.FileName);
}
return null;
};
Invoke(del);
}
Run Code Online (Sandbox Code Playgroud)
我来自Java世界,所以我并不熟悉C#UI编程的复杂性.
我在这里缺少什么?
我有
interface FooI
class FooA implements FooI
class FooB implements FooI
class FooC implements FooI
Run Code Online (Sandbox Code Playgroud)
我写了一个类"Handler",它有以下方法
static double handle(FooA f)
static double handle(FooB f)
static double handle(FooI f)
Run Code Online (Sandbox Code Playgroud)
我有一个像下面这样的功能:
void caller(FooI f)
{
Handler.handle(f);
}
Run Code Online (Sandbox Code Playgroud)
f只是被称为实现FooI的类.然而,f是FooA的一个实例
调用FooI的方法而不是调用FooA的方法.
当我使用f.getClass().getName()时,我得到了正确的类名(FooA).
我很困惑,因为我期望最适合的方法被调用,即FooA的方法.
我想使用FooI方法作为后备来处理可以在以后实现的类,并且我还想处理f而没有一个大函数,我正在对实现我的接口的所有当前已知类进行instanceof检查.
这样做有什么好办法?