责任链与反思

时间:2017-06-06 09:51:12

标签: c# design-patterns reflection

前一段时间我在一个正在研究的网站上删除了一系列责任。 该链将调用一种方法来为网站生成动态表单。调用的每个对象都将返回其形式或“将球传递”到下一个对象以检索表单。 该网站有大约300多个具有这种逻辑的类,在性能方面没什么大不了的,但我发现它看起来很糟糕并且调试它。

所以我决定删除链调用,然后用反射代替它,我知道我必须通过一个唯一的静态“名称”调用哪个对象(在链中使用相同的名称来检查对象是否必须加载类的形式或“传递球”)并通过预先列出列表中的所有对象,我将检查该名称以确保调用正确的类/方法。

我知道反射应该在性能方面较慢但经过一些测试后我看不到任何可比的差异,因为代码更清晰,所以更容易理解和调试。

所以我的问题是:

这是一种正确的方法还是在这样的情况下有更好的模式?

我觉得我更多地使用反射,然后我应该编码,而且我不知道它是否总是更好的选择。

这在1课程中:

foreach (TemplateHandler t in objectList)
{
    if (t.GetType().GetProperty("serviceCode") != null)
    {
        if (t.GetType().GetProperty("serviceCode").GetValue(t).ToString() == serviceCodeToCallFromParam)
        {       
            return t.GetTemplateParam(serviceCodeToCallFromParam/*, ...other params...*/);
        }
    }
}

超过300+课程:

public override List<Form> GetTemplateParam(string serviceCode)
{
    if (serviceCode == ClassServiceCode)
    {
        // long form logic build.
        //..
    }
    else
    {
        if (successor != null)
            form = successor.GetTemplateParam(serviceCode);
    }
    return form;
}

1 个答案:

答案 0 :(得分:1)

如果必须从这两个中选择,反射解决方案看起来会更好。传球300次看起来毫无意义。

但是,正如您所指出的,性能可能是问题所在。如果您已经知道要完成工作的类,那么为什么不实现类似Builder或Factory模式的东西来创建适当类的实例并完成工作。

更简单的是switch-case结构。在switch-case中放置和创建代码,并使用生成的对象来完成工作。

修改1:

public T CreateTemplate<T>() where T : ITemplate
{
    ITemplate template = null;
    if(typeof(T) == typeof(Type1Template))
        template = new Type1Template(....);
    else if(typeof(T) == typeof(Type2Template))
        template = new Type2Template(....);
    else
        throw new TemplateException("Template type is not configured.");

    return (T)template;
}

修改2

看看下面的内容是否有帮助:

public T CreateTemplate<T>()
{
    ITemplate template = (T)Activator.CreateInstance(typeof(T));
    return template;
}