簡體   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