在没有重写代码的情况下在外部别名之间切换?

时间:2011-03-15 17:27:47

标签: c# alias extern

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的不同版本。

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();
    }

 }

答案 1 :(得分:0)

这是一些反思代码。它基于Hilyard和Teilhet在O'Reilly的C#Cookbook中给出的代码。我改编了它并删除了一些东西,我没有测试过,但如果你使用反射,这样的东西对你有用。你只需要传递正确的程序集名称(仍然没有弄清楚如何处理具有相同命名空间的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);

    }

答案 2 :(得分:0)

我最终在.Net 4.0中使用了动态。

将外部别名与动态结合使用是解决此问题的最简洁,最简单的解决方案。

答案 3 :(得分:0)

你能创建一个枚举来指定使用哪个别名吗?然后你会有像

这样的东西
ObservableCollection