C# 在不重新编写代码的情况下在外部别名之间切换?

C# 在不重新编写代码的情况下在外部别名之间切换?,c#,alias,extern,C#,Alias,Extern,我希望能够做到的是: extern alias dll1; extern alias dll2; ... public void DoStuff1(){ dll1::NameSpace.Class.Method(); } public void DoStuff2(){ dll2::NameSpace.Class.Method(); } alias似乎无法像这样使用 附录:dll1和dll2是同一dll的不同版本 在不同的文件中保留来自不同别名的代码,并在每个文件中使用

我希望能够做到的是:

extern alias dll1;
extern alias dll2;    
...

public void DoStuff1(){
    dll1::NameSpace.Class.Method();
}
public void DoStuff2(){
    dll2::NameSpace.Class.Method();
}
alias似乎无法像这样使用


附录:dll1和dll2是同一dll的不同版本

在不同的文件中保留来自不同别名的代码,并在每个文件中使用分部类。(分部类允许您在不同的文件中为同一个类编写代码。)这应该可以做到

例如:

文件1:

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

extern alias dll1;

partial class foo
{

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

}

在不同的文件中保留来自不同别名的代码,并在每个文件中使用分部类。(分部类允许您在不同的文件中为同一个类编写代码。)这应该可以做到

例如:

文件1:

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

extern alias dll1;

partial class foo
{

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

}

下面是一些反射代码。它基于Hilyard和Teilhet在O'Reilly的C#Cookbook中给出的代码。我修改了它并删除了一些东西,我还没有测试它,但是如果你使用反射,像这样的东西会对你有用。您只需传入正确的程序集名称(仍然没有弄清楚如何处理具有相同命名空间的DLL,但必须有一种方法),以及正确的类和方法名称,此函数将为您调用适当的方法

反射的一个问题是您丢失了一些类型检查,因为您必须使用泛型对象,并且必须使用字符串来表示名称空间、类型和成员

 extern alias dll2;


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

 }

下面是一些反射代码。它基于Hilyard和Teilhet在O'Reilly的C#Cookbook中给出的代码。我修改了它并删除了一些东西,我还没有测试它,但是如果你使用反射,像这样的东西会对你有用。您只需传入正确的程序集名称(仍然没有弄清楚如何处理具有相同命名空间的DLL,但必须有一种方法),以及正确的类和方法名称,此函数将为您调用适当的方法

反射的一个问题是您丢失了一些类型检查,因为您必须使用泛型对象,并且必须使用字符串来表示名称空间、类型和成员

 extern alias dll2;


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

 }

最后,我在.NET4.0中使用了dynamic


将使用外部别名与dynamic相结合是解决此问题的最干净、最简单的方法

我最终在.NET4.0中使用了dynamic


将使用外部别名与dynamic相结合是解决此问题的最干净、最简单的方法

您可以创建一个枚举来指定要使用的别名吗?然后你会有类似的

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

    }

您能否创建一个枚举来指定要使用的别名?然后你会有类似的

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

    }

Eugenio,您发布的解决方案仍然需要编写两个不同的DoStuff函数。我希望能够编写一个DoStuff函数并指定它使用的dll。我在原来的帖子中补充说,dll1和dll2是同一dll的不同版本。谢谢如果您试图访问的是实例方法,则可以传入正确类的实例。您可以将静态方法重写为实例方法。否则,我相信反射可以解决您的问题,但不会没有一些冗长的代码和一些开销。在这种情况下,您会建议使用反射覆盖外部别名吗?我对反射一无所知,它有什么好处?我很少使用反射,但我知道的是:可以传入一个字符串来描述名称空间/类的全名,以便在该名称空间/类中创建对象或调用方法。我想,当名称空间不明确时,您还可以在字符串中指定要使用的dll。查找有关类型类的信息。如果我能找到一些代码,我会发布它。反射的优点是任何事情都是可能的。它向您公开了代码的底层结构,但有时过于抽象,导致代码繁琐,这是我们不希望看到的。Eugenio,您发布的解决方案仍然需要编写两个不同的DoStuff函数。我希望能够编写一个DoStuff函数并指定它使用的dll。我在原来的帖子中补充说,dll1和dll2是同一dll的不同版本。谢谢如果您试图访问的是实例方法,则可以传入正确类的实例。您可以将静态方法重写为实例方法。否则,我相信反射可以解决您的问题,但不会没有一些冗长的代码和一些开销。在这种情况下,您会建议使用反射覆盖外部别名吗?我对反射一无所知,它有什么好处?我很少使用反射,但我知道的是:可以传入一个字符串来描述名称空间/类的全名,以便在该名称空间/类中创建对象或调用方法。我想,当名称空间不明确时,您还可以在字符串中指定要使用的dll。查找有关类型类的信息。如果我能找到一些代码,我会发布它。反射的优点是任何事情都是可能的。它向您公开了代码的底层结构,但有时过于抽象,导致代码繁琐,这是我们不想要的。反射代码有帮助吗?这是你想的吗?您可以传递一个字符串来描述所需的正确dll,而不是将别名参数传递给您的函数,尽管您必须弄清楚其中的细节。反射代码有帮助吗?这是你想的吗?您可以传递一个字符串来描述所需的正确dll,而不是将别名参数传递给函数,尽管您必须了解其细节。