c# - 如何找到实现接口(interface)的类

标签 c# winforms .net-4.0

我的 WinForms、基于 C# 的应用程序有一个架构问题。我真的希望有人能告诉我如何解决这个问题。

我有不同的类实现接口(interface) ITest1 或 ITest2 或两者。

class1 : ITest1
class2 : ITest1, ITest2
class3 : ITest2

在应用程序开始时,我有一些配置源告诉应用程序在 ITest1 和 ITest2 的应用程序的整个生命类型(类 1、类 2 或类 3)中使用哪些类

ITest1 test1;
ITest2 test2;
switch (configresult)
{
    case "configuration1":
        test1 = new class1();
        test2 = new class2();
        break;
    case "configuration2":
        test1 = new class2();
        test2 = new class3();
        break;
    case "configuration3":  // This happens the most!
        test1 = new class2();
        test2 = (class2)test1;
        break;
}

现在我想知道在运行时哪个类实现了某个接口(interface)。在伪代码中:

if( test1 is implemented by class2 )
    ((class2)test1).Class2Method();

if( test2 is implemented by class1 )
    ((class1)test1).Class1Method();

有没有办法通过可用的接口(interface)变量找出用于实现接口(interface)的类?

在实际程序中,我有超过 10 个接口(interface),由 40 多个类以完全不同的方式实现,因此我不想在需要转换回原始类的所有时刻执行任何 switch 语句。

----------------更新!

我想一些背景信息可以更容易地解决我的问题,是的,我同意 Ed S. 的观点,这更多是关于我的设计的问题,但我非常愿意改变这一切。

我的科学应用程序支持 40 多种不同的科学仪器来测量半导体。温度、电流、电压、开关,应有尽有。我定义了10个可供用户使用的功能:温度、电压、电流、开关等……这些都放在接口(interface)中; I温度、I电压等...

有些仪器可以做任何事情,有些只能做部分。如果用户有一个支持的高质量温度测量设备,我们用它来实现 ITemperature,但是当他/她有一个昂贵的电压表也可以测量温度时,我使用相同的仪器来测量温度和电压(所以仪器实现了 ITemperature和 IVoltage)。所有乐器都非常非常不同,几乎不可能创建一个抽象类来涵盖所有乐器。有些需要通过网络界面进行控制,有些需要通过 USB 进行控制,相信我,很多事情都不一样。所以有时我需要直接访问仪器类(重置寄存器、初始化或其他)。这就是我试图做的。非常欢迎任何建议。

最佳答案

记录了 is 关键字 here尽管从您的问题听起来您的架构中存在更大的问题。

if( test1 is class2 )
    ((class2)test1).Class2Method();

if( test2 is class1 )
    ((class1)test1).Class1Method();

关于c# - 如何找到实现接口(interface)的类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13828059/

相关文章:

c# - 服务器客户端发送/接收简单文本

c# - SlimDX加载预编译着色器

asp.net - <httpRuntime requestValidationMode ="2.0"/>不起作用(使用IIS 6.0)

c# - 引用 com 程序集 dll 时出现问题

c# - 如何使用复选框显示/隐藏表单?

c# - 访问程序自己的目录

c# - 如何将 ComboBox 绑定(bind)到具有深层 DisplayMember 和 ValueMember 属性的通用列表?

c# - 当基类是泛型时在 XAML 中设置依赖属性

C# 更新对象引用和多线程

c# - 为什么 System.Drawing.Fontconverter.ConvertFromInvariantString ("NOTAFONT")返回 SansSerif?