2011-03-15 80 views
2
extern alias dll1; 
extern alias dll2;  
... 

public void DoStuff1(){ 
    dll1::NameSpace.Class.Method(); 
} 
public void DoStuff2(){ 
    dll2::NameSpace.Class.Method(); 
} 

我想什麼,能夠做的是:在不重寫代碼的情況下在外部別名之間切換?

public void DoStuff(alias a){ 
    a::NameSpace.Class.Method(); 
} 

別名沒有出現爲可用這樣。

附錄:dll1和dll2是同一個dll的不同版本。

+0

反射代碼有幫助嗎?這是你想到的嗎?您不必將一個別名參數傳遞給您的函數,而是傳遞一個描述您所需的正確dll的字符串,儘管您必須弄清楚這些細節。 – 2011-03-18 15:38:16

回答

0

我結束了在.Net 4.0中使用動態。

將外部別名與動態結合使用是解決此問題的最簡潔最簡單的解決方案。

0

保留來自不同別名的代碼在不同的文件中,並在每個文件中使用部分類。 (部分類允許您在不同的文件中爲同一個類編寫代碼。)應該這樣做。

例如:

文件1:

extern alias dll1; 

partial class foo 
{ 

public void DoStuff1(){ 
     dll1::NameSpace.Class.Method(); 
} 

} 

文件2:

extern alias dll2; 


partial class foo 
{ 
    public void DoStuff2(){ 
     dll2::NameSpace.Class.Method(); 
    } 

} 
+0

Eugenio,您發佈的解決方案仍然需要編寫兩個不同的DoStuff功能。我希望能夠編寫一個DoStuff函數並指定它使用的是哪個dll。我在我原來的帖子中添加了dll1和dll2是同一個dll的不同版本。謝謝! – sooprise 2011-03-16 13:24:16

+0

我明白你的意思了...... – 2011-03-16 17:18:45

+0

如果你試圖訪問的是實例方法,你可以傳入正確類的實例。您可以將靜態方法重寫爲實例方法。否則,我確信反射可以​​解決你的問題,但不是沒有一些詳細的代碼和一些開銷。 – 2011-03-16 17:26:38

0

下面是一些反射代碼。它基於Hilyard和Teilhet在O'Reilly的C#食譜中給出的代碼。我調整了它並刪除了一些東西,但我沒有測試它,但是如果使用反射,這樣的東西就可以適用於您。你只需要傳入正確的程序集名稱(仍然沒有想出如何處理具有相同命名空間的dll,但必須有一種方法)以及正確的類名稱和方法名稱,並且此函數將調用適合你的方法。

反射的一個問題是你失去了一些類型檢查,因爲你必須使用泛型對象,並且必須使用字符串來表示名稱空間,類型和成員。

object InvokeMethod(string assembly, string type, string method, object[] parameters) 
    { 
     Assembly asm = Assembly.LoadFrom(assembly); 
     Type classtype = asm.GetType(type, true, false); 
     object dynamicObject = Activator.CreateInstance(classtype); 

     MethodInfo invokedMethod = classtype.GetMethod(method); 

     return invokedMethod.Invoke(dynamicObject,parameters); 

    } 
0

你可以製作一個枚舉來指定要使用哪個別名?那麼你會有類似

public void DoStuff(int a){ 
    if(a==0) 
     dll1:Namespace.Class.Method() 
    else if(a==1) 
     dll2:Namespace.Class.Method() 
} 
相關問題