Создать объект класса на основе строкового идентификатора в C#

StackOverflow https://stackoverflow.com//questions/11686881

Вопрос

Я новичок в программировании, будьте любезны меня отнести.Я использую c Sharp, .net 4, VS 2010.

У меня есть класс интерфейса под названием IHandler с методом IsValidate().У меня есть сообщение типа AMOUNT 50 22.4, где AMOUNT является идентификатором.Таким образом, формат сообщений может быть таким: FLOW 12 33 23.1, опять же где FLOW является идентификатором.

Теперь, в зависимости от идентификатора, у меня есть разные классы, например (у меня около 15–20 таких классов, так как мне нужно проверять разные форматы и последовательность сообщений)

  1. AmountValidator

  2. FlowValidator

В этих классах у меня есть реализация IsValidate() метод, поскольку они реализуют IHandler сорт.

Теперь мой вопрос: как только я определю идентификатор моего сообщения, например AMOUNT или FLOW я хочу создать экземпляр класса.

Как лучше всего это сделать? (Я не хочу создавать 30 экземпляров в операторе if else)

Цените любую помощь.

Это было полезно?

Решение

Вы можете сделать это так:

IHandler handler = (IHandler)Activator.CreateInstance("assemblyname", "typename");
handler.IsValidate();
.

Имя сборки можно найти на странице свойств на проекте, где обработчики.

Вот: Название сборки

Вы также должны помнить, что все зависит от случая, поэтому аргумент TypeName не может быть увеличен, если класс фактически называется Summalvalidator.

<Сильные> Редактировать : заводская образец:

public static class HandlerFactory {
    private static Object factoryLock = new Object();
    private static List<IHandler> handlers = null;

    public static IHandler Gethandler(String type) {
        if (handlers == null) {
            lock (factoryLock) {
                if (handlers == null) {
                    IEnumerable<Type> types = typeof(HandlerFactory).Assembly.GetTypes().Where(t => t.GetInterfaces().Contains(typeof(IHandler)));
                    handlers = types.Select(t => (IHandler)Activator.CreateInstance(t));
                }
            }
        }
        return handlers.Where(h => h.Type == type);
    }
}

public interface IHandler {
    String Type { get; }
    Boolean IsValid(String data);
}
.

Другие советы

Реализация завода, где вы должны перечислить валидаторы один раз в конструкторе, предполагая, что валидаторы являются безвыходными:

    public class HandlerFactory
{
    private Dictionary<string, IHandler> _handlers = new Dictionary<string,IHandler>();

    public HandlerFactory()
    {
        _handlers.Add("AMOUNT", new AmountValidator());
        _handlers.Add("FLOW", new FlowValidator());
    }

    public IHandler Create(string key)
    {
        IHandler result;
        _handlers.TryGetValue(key, out result);
        return result;
    }
}
.

Дайте мне знать, если вы хотите, чтобы я уточнил с отражением и МОК.Это изменило бы так, как вы инициализируете словарь.

Если все ваши IHandler классы содержатся в той же сборке, что и ваше приложение (не загружаются динамически, как плагины), Шаблон фабричного метода может быть хорошим выбором.Вы можете централизовать создание IHandler классы с этим шаблоном проектирования.Если, с другой стороны, IHandler классы загружаются во время выполнения, вам нужно воспользоваться .NET-отражение.Есть также открытый исходный код IoC-контейнеры это может помочь при создании объектов, но я думаю, что это немного излишество.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top