在C#中根据字符串标识创建类对象

时间:2012-07-27 11:30:19

标签: c# .net parsing object validating

我是编程的新手,善待我。我使用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

  3. 在这些类中,我实现了IsValidate()方法,因为它们实现了IHandler类。

    现在我的问题是,一旦我确定了我的消息的标识符,例如AMOUNTFLOW,我想创建该类的实例。

    最好的方法是什么?(我不想在if else语句中创建30个实例)

    感谢任何帮助。

3 个答案:

答案 0 :(得分:3)

你可以这样做:

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

程序集名称可以在处理程序所在的项目的属性页面上找到。

此处:assembly name

您还必须记住,所有内容都区分大小写,因此如果类实际上名为AmountValidator,则typename参数不能是AMOUNTValidator。

编辑:工厂样本:

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);
}

答案 1 :(得分:2)

工厂实现,您应该在构造函数中列出一次验证器,假设验证器是无状态的:

    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;
    }
}

如果您希望我详细说明Reflection和IoC,请告诉我。这会改变你初始化字典的方式。

答案 2 :(得分:1)

如果所有IHandler类都包含在与应用程序相同的程序集中(不像插件那样动态加载),Factory method pattern可能是个不错的选择。您可以使用此设计模式集中创建IHandler类。 另一方面,如果在运行时加载IHandler类,则需要利用.NET Reflection。 还有开源IoC containers可以帮助创建对象,但我猜它们有点过分。