繁体   English   中英

我如何找到实现接口的类

[英]How do I find the class that implemented an interface

我对基于C#的WinForms应用程序有体系结构问题。 我真的希望有人能给我一个解决方法的想法。

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

class1 : ITest1
class2 : ITest1, ITest2
class3 : ITest2

在应用程序的开头,我有一些配置源,可以告诉应用程序在ITest1和ITest2的整个应用程序生命周期(class1,class2或class3)的整个生命周期中使用哪些类。

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;
}

现在,我想知道在运行时哪个类实现了特定的接口。 用伪代码:

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

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

有没有一种方法可以通过使接口变量可用来找出用于实现接口的类?

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

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

我想一些背景信息可以更轻松地解决我的问题,是的,我同意Ed S.关于我的设计的更多问题,但我非常愿意对此进行更改。

我的科学应用程序支持40多种不同的科学仪器来测量半导体。 温度,电流,电压,开关都可以命名。 我定义了10种可供用户使用的功能:温度,电压,电流,开关等。 温度,IVoltage等

有些乐器可以做所有事情,有些只能做零件。 如果用户拥有受支持的高质量温度测量设备,我们将使用它来实现ITemperature,但是,当他/她拥有昂贵的电压表也可以测量温度时,我会使用同一台仪器来测量温度和电压(因此该仪器可以实现ITemperature和IVoltage)。 所有工具都非常非常不同,几乎不可能使一个抽象类覆盖所有这些工具。 有些需要通过Web界面进行控制,有些需要通过USB进行控制,并且相信我有很多不同之处。 因此,有时我需要直接访问工具类(以重置寄存器,初始化等)。 这就是我试图做的。 任何建议都非常欢迎。

尽管听起来好像您的问题在体系结构中遇到了更大的问题,但是这里记录了is关键字。

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

if( test2 is class1 )
    ((class1)test1).Class1Method();
if (test1.GetType() == typeof(class2)) ...

或者:

var c = test1 as class2;
if (c != null) c.Class2Method();

我认为您真正要寻找的是Duck Typing,而不是演员。 转换几乎是一个编译时活动。 您可以使用library或C#4.0的dynamic关键字实现鸭子输入。

public static dynamic Quack(dynamic duck)
{
    try
    {
        // bind method at run time and execute it
        return duck.Quack();
    }
    catch (RuntimeBinderException)
    {
        //throw if method call failed
        return null;
    }        
}

您可以在运行时进行强制转换,并在强制转换上调用方法,但是它使用了Reflection,并且速度并不快。 这里

您无需知道哪个类实现了接口。 相反,您可以直接通过界面访问所需的功能。 这就是接口的作用。

ITest1 test1 = obj as ITest1;
if (test1 != null) {
    test1.Test1InterfaceMethod();
}

ITest2 test2 = obj as ITest2;
if (test2 != null) {
    test2.Test2InterfaceMethod();
}

与转换相比, as关键字的优势在于,对类型和转换的测试仅是一项操作。 否则,您必须使用is测试类型,然后使用()进行强制转换,然后内部再次对类型进行测试:-(

使用要测试的对象的GetType()方法。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM