如何从具有略微不同构造函数的类动态创建对象

时间:2011-11-07 07:30:09

标签: c# .net winforms

我正在使用WinForms应用程序。

我有一组测试类,每个类执行不同的操作,但80%的类使用几乎相同的构造函数。我使用反射在List中运行时动态创建类实例,可能会有许多不同且相同类型的测试。

currentTest = (ISystemTest)Activator.CreateInstance(classtype,
                                                    gui,
                                                    param1,
                                                    param2,
                                                    param3,
                                                    param4,
                                                    currentProgressUpdater);

然后通过Action运行实例。

正如我所说,一些建设者的签名略有不同。我曾经使用过switch语句,但通过反射它变得更容易维护。

要解决不同构造函数签名的问题,我要么有一些创造性的解决方案,要么创建大型构造函数,其默认值为test,不需要某些数据。

因此,如果您对这个问题有创造性的解决方案,我很乐意听到它。

构造函数示例:

  • ClassName(gui, param1, param2, param3, progressUpdater) =>大约80%的当前测试

  • ClassName(gui, param1,param4, param5) =>大约10%的当前测试

  • ClassName(param4, param6) => 10%的当前测试

类型是自定义类,而不是字符串或整数

3 个答案:

答案 0 :(得分:5)

您描述的问题通常通过dependency injection解决。您可以使用依赖注入框架,例如Managed Extensibility Framework

编辑:您可以找到有关如何将MEF用于DI herehere的一些示例。其他DI框架(unityautofacNinject)类似地工作。我自己也使用过MEF和autofac,尽管所涉及的概念需要一点点学习才能开始,但它们很快变得非常直观,并且非常有用。 Autofac以上瘾 IoC容器的形式呈现,无论您使用何种框架,它都会让人上瘾。

答案 1 :(得分:0)

激活器没有真正的方法可以在不同的构造函数中注入哪些参数。你不想要这个,因为你可以很快地烧伤你的手指。

也就是说,您可以使用依赖注入框架(如MEF或Unity)或您喜欢的任何注入框架。这允许您在需要的地方进行控制。

另一种选择是使用包含公共属性的设置类而不是具有许多参数的构造函数。

**编辑**附加设置类的代码示例

class ConsumerSettings
{
    public string Property1 { get; set; }

    public string Property2 { get; set; }
}

class Consumer1
{
    public Consumer1(ConsumerSettings settings)
    {
        if (settings.Property1 == "foo")
        {
        }
    }
}

class Consumer2
{
    public Consumer2(ConsumerSettings settings)
    {
        if (settings.Property2 == "bar")
        {
        }
    }
}

答案 2 :(得分:-2)

您可以提供显示测试所需参数的元数据。 例如,您可以声明一个定义一组参数的属性:

[Flags]
public enum TestParams { Param1 = 1, Param2 = 2, Param3 = 4, All = Param1 | Param2 | Param3 };
public class ParamsAttribute : Attribute {
    readonly TestParams params;
    public ParamsAttrbiute (TestParams params) {
        this.params = params;
    }
    public TestParams Params { get { return params; } }
} 

检查激活器中的ParamsAttribute和Params属性值,并仅提供必要的参数。

相关问题