Выбор объекта из другого пространства имен во время выполнения в C #? - PullRequest
4 голосов
/ 03 мая 2011

Можно ли выбрать пространство имен для классов во время выполнения. У нас есть две копии автоматически сгенерированных объектов в разных пространствах имен. Вот пример:

Namespace1
    ClassA
    ClassB

Namaspace2
    ClassA
    ClassB

Ранее код был простым, как показано ниже

using Namespace1
...
    ClassA.AMethod()

Однако нам нужно выбрать пространство имен во время выполнения, используя переменную условия. Есть ли способ определить метод GetNamespace () и использовать его, как показано ниже, или есть другой способ, который вы рекомендуете?

GetNamespace().ClassA.AMethod()

Ура, Бурак

Ответы [ 3 ]

1 голос
/ 03 мая 2011

Учитывая, что вы можете:

var type = Type.GetType("Namespace1.ClassA");
object instance = Activator.CreateInstance(type);

Если вы затем хотите вызывать методы для этого экземпляра, вам нужно либо привести его к общему интерфейсу, либо получить экземпляр MethodInfo для вызова.Если вы контролируете генерацию классов, я бы рекомендовал интерфейсный подход:

public interface IClassA
{
    void AMethod();
}

namespace Namespace1
{
    public class ClassA : IClassA
    { /* Stuff... */ }
}

Таким образом, вам нужно только:

var type = Type.GetType("Namespace1.ClassA");
IClassA instance = (IClassA)Activator.CreateInstance(type);

instance.AMethod();

Большинство автоматически сгенерированных классов используют такие инструменты, как Linq-to-Sql, Entity Framework и даже прокси-серверы WCF создаются как partial, что означает, что вы можете создать дополнительный файл, например ClassA.partial.cs, и добавлять больше в объявления классов, не изменяя автоматически сгенерированный класс:

partial class ClassA : IClassA { }
1 голос
/ 03 мая 2011

Насколько я знаю, нет никакого способа динамически выбирать пространство имен, но я думаю, что вы находитесь в идеальной ситуации, чтобы использовать factory .Для этого все ваши классы А должны быть производными от абстрактного:

namespace Common {

public abstract class AbsA
{
    //...
}

public class MyFactory
{
    public MyFactory()
    {
        //...
    }

    public AbsA getA()
    {
        AbsA a;
        if (condition)
            a = new Namespace1.A();
        else
            a = new Namespace2.A();
        return a;
    }
}

}

Затем вы запрашиваете у вашей фабрики создание объекта:

MyFactory factory = new MyFactory();
labelMessage.Text = factory.getA().Something;

Это немного усложняет вашу структуру, нотакже делает его более связным.

1 голос
/ 03 мая 2011

Два типа из разных пространств имен полностью разных типов в отношении CLR. По сути, вам нужно учитывать те же решения, что и при выборе между любыми другими типами ... например, заставляя оба класса реализовывать один и тот же интерфейс, и вместо GetNamespace(), возвращающего пространство имен, ему придется возвращать сам объект.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...