2011-03-15 79 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() 
} 
相关问题