Создать объект класса на основе строкового идентификатора в C#
-
12-12-2019 - |
Вопрос
Я новичок в программировании, будьте любезны меня отнести.Я использую c Sharp, .net 4, VS 2010.
У меня есть класс интерфейса под названием IHandler
с методом IsValidate()
.У меня есть сообщение типа AMOUNT 50 22.4
, где AMOUNT
является идентификатором.Таким образом, формат сообщений может быть таким: FLOW 12 33 23.1
, опять же где FLOW
является идентификатором.
Теперь, в зависимости от идентификатора, у меня есть разные классы, например (у меня около 15–20 таких классов, так как мне нужно проверять разные форматы и последовательность сообщений)
AmountValidator
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-контейнеры это может помочь при создании объектов, но я думаю, что это немного излишество.