Простого выполнения modelType.ToString () недостаточно, как я могу использовать его через Activator.CreateInstance? - PullRequest
0 голосов
/ 17 апреля 2010
  public class MyController
    {
        public object CreateByEnum(DataModelType modeltype)
        {
            string enumText = modeltype.ToString(); // will return for example "Company"
            Type classType = Type.GetType(enumText); // the Type for Company class
            object t = Activator.CreateInstance(classType); // create an instance of Company class
            return t;
        }
    }

    public class CompanyView
    {
        public static List<Personel> GetPersonel()
        {
            MyController controller = new MyController();
            _Company company = controller.CreateByEnum(DataModelType.Company) as _Company;
            return company.GetPersonel();
        }
    }

    public enum DataModelType
    {
        xyz,
        klm,
        tucyz,
        Company
    }

Да, я согласен, Activator.CreateInstance () очень полезен. К сожалению, мне нужно передать правильный тип. Это означает создание правильной строки для передачи в Type.GetType (). Если я отслеживаю вызов Controller.CreatebyEnum () в коде, который я разместил выше, простого выполнения modelType.ToString () недостаточно даже для случая DataModelType.Company. Моим решением будет узкое место в обслуживании. Что было бы лучше, это то, что принимает результаты modelType.ToString () и затем рекурсивно просматривает все типы, найденные во всех сборках, загруженных в текущий AppDomain. Согласно MSDN, Type.GetType () ищет только текущую вызывающую сборку и mscorlib.dll. Как я могу это сделать? , мне нужна лучшая производительность?

1 Ответ

0 голосов
/ 19 апреля 2010

Я использую Activator.CreateInstance в качестве основной части моей инфраструктуры, главным образом для реализации реализаций моих поставщиков доступа к данным (которые определяются интерфейсом).

Поскольку я знаю, какой из них мне нужен, я просто передаю ключ AppSetting, чтобы вы могли изменить, какие из них вы используете, через config.

Я согласен с Кейном - я не уверен на 100%, что у вас за вопрос.

Если вы передаете перечисление, разве это не говорит о том, что вы знаете, какой тип вы хотите создать (даже если только в общем смысле, а не в явном)?

В какой-то момент что-то должно будет принять решение относительно того, что происходит - вы знаете, кто / что это такое? Возможные варианты:

  1. Через конфигурацию: хорошо, когда вам нужен контроль, но на самом деле не слишком часто меняйте настройки. Также подходит для общих понятий (клиенты = настройка A; продукты = настройка B и т. Д.).
  2. Сохранение целевого типа в базе данных со связанными данными - позволит вам связать конкретную реализацию (передаваемую в активатор) с любым экземпляром класса. Это обеспечивает более высокую степень контроля - но как этот тип определяется и сохраняется в первую очередь?
  3. Вместо того, чтобы использовать ToString () (которую вы могли бы перегрузить / заменить), используйте OO для добавления нового члена в каждый рассматриваемый класс (возможно, простой интерфейс), где новый член возвращает информацию, необходимую для активатора.

Может быть, вы просто просите слишком много самого перечисления? Вы все еще должны иметь возможность использовать enum для управления выполнением, но вам нужно отделить способ создания экземпляров.

Это достаточно ясно, или людям нужны / нужны примеры кода?

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