Переключение между внешними псевдонимами без переписывания кода? - PullRequest
2 голосов
/ 15 марта 2011
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 голосов
/ 19 ноября 2015

Можете ли вы сделать перечисление, в котором будет указано, какой псевдоним использовать?Тогда у вас будет что-то вроде

public void DoStuff(int a){
    if(a==0)
        dll1:Namespace.Class.Method()
    else if(a==1)
        dll2:Namespace.Class.Method()
}
0 голосов
/ 16 марта 2011

Вот код отражения.Он основан на коде, приведенном в 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);

    }
0 голосов
/ 21 марта 2011

Я закончил с использованием динамического в .Net 4.0.

Сочетание использования внешних псевдонимов с динамическим было самым чистым и простым решением этой проблемы.

0 голосов
/ 16 марта 2011

Храните код из разных псевдонимов в разных файлах и используйте частичные классы в каждом файле. (Частичные классы позволяют писать код для одного и того же класса в разных файлах.) Это должно быть сделано.

Например:

Файл 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();
    }

 }
...