[英]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完全相同。 只是別名不同。
當我們想要更新代碼時,我們被迫將代碼從一個類復制到所有其他類中。 然后,我們只需將一個別名替換為另一個別名即可。
有沒有一種方法可以創建單個類,並在實例化該類時簡單地動態指定要使用的外部別名?
謝謝你的幫助。
選項:
我個人可能會選擇后者。 不,沒有“動態外部別名”這樣的上下文。
我建議為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.