簡體   English   中英

是否可以在C#中動態指定extern別名?

[英]Is it possible to dynamically specify an extern alias in C#?

假設您有兩個包含幾乎相同代碼的DLL。 它們之間只有很小的差異,但是這些差異非常重要,需要保持不同的庫。 實際上,在我的特定情況下,它們是第三方Java庫,已使用IKVM轉換為.NET DLL,因此,如果不自己重寫代碼,我們就無法將它們折疊為一個。 這些代表由外部供應商提供的服務器API的稍有不同的版本。

當我們在代碼中使用這些庫時,除了我們指定的外部別名不同之外,我們不得不編寫兩個完全相同的類。

例如:

extern alias Lib1;

namespace MyNamespace
{
    public Class1
    {
        private Lib1::A a = new Lib1::A();

        public Class1()
        {
            this.a.DoStuff();
        }

        // Uses Lib1 extern alias throughout
    }
}

extern alias Lib2;

namespace MyNamespace
{
    public Class2
    {
        private Lib2::A a = new Lib2::A();

        public Class1()
        {
            this.a.DoStuff();
        }

        // Totally identical to Class1, except that it uses Lib2 extern alias throughout
    }
}

Class1中的所有代碼與Class2完全相同。 只是別名不同。

當我們想要更新代碼時,我們被迫將代碼從一個類復制到所有其他類中。 然后,我們只需將一個別名替換為另一個別名即可。

有沒有一種方法可以創建單個類,並在實例化該類時簡單地動態指定要使用的外部別名?

謝謝你的幫助。

選項:

  • 針對單個DLL構建,然后僅切換DLL內容(即,使用相同的名稱構建兩個DLL,並僅更改使用的版本)
  • 創建具有兩個不同實現的單個接口,其中一個與每個庫對話

我個人可能會選擇后者。 不,沒有“動態外部別名”這樣的上下文。

我建議為Lib1.A和Lib2.A定義一個接口。

然后如下實現Class2

    public MyClass
    {
        private readonly ILib _lib; 

        public Class2(ILib lib)
        {
          _lib = lib
        }
        public MyMethod()
        {
            _lib.DoStuff();
        }                
    }

您可以按以下方式調用它: new MyClass(new Lib1::A()).MyMethod()new MyClass(new Lib2::A()).MyMethod()

注入ILib依賴項也會幫助對其進行單元測試。

我發現做您所說的最好的方法是在更高級別上使用名稱空間...這樣,您可以確定要調用的名稱空間,然后在單個類中調用正確的名稱空間。

按照Jon Skeet的回答,您可以創建一個抽象類,並實現這兩個類之間的所有通用“重復”代碼,並將需要唯一代碼的方法標記為抽象。

這樣,您就不會在任何地方重復代碼,而且由於多態性,更改上下文根本沒有困難。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM