我的 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/