传递要使用构造函数或方法的参数创建的对象列表

时间:2013-10-10 21:27:42

标签: c# constructor activator

基本上我要做的是创建一个可以使用

批量创建对象的类
Activator.CreateInstance(Type type, params object[] args)

我需要将所有对象蓝图传递给一个名为ObjectMap的类的构造函数。它需要是一个类型和参数的对。如果允许解决方案,它也可以是另一个类而不是构造函数的方法。

有点像

new ObjectMap([Type, somevalue, somevalue, somevalue], [Type, somevalue], [Type] ...)

Resources.AddObjectMap([Type, somevalue, somevalue, somevalue], [Type, somevalue], [Type] ...)

我不知道如何制作它,以便你可以传递可变数量的参数与可变数量的参数(甚至0)。哎呀,我甚至很难解释这个问题。问我一些你不清楚的事情= S

Gr.Viller

2 个答案:

答案 0 :(得分:6)

我建议你将“type和args”封装到特定类型中......然后你可以使用params数组。例如:

// TODO: Find a better name :)
public class TypeBlueprint
{
    public Type Type { get; set; }
    public List<object> Arguments { get; set; }

    public TypeBlueprint()
    {
        this.Arguments = new List<object>();
    }

    public TypeBlueprint(Type type, params object[] arguments)
    {
        this.Type = type;
        this.Arguments = arguments.ToList();
    }
}

然后:

public ObjectMap(params TypeBlueprint[] blueprints)

并将其命名为:

var map = new ObjectMap(new TypeBlueprint(typeof(Foo), "x", "y", "z"),
                        new TypeBlueprint { Type = typeof(Bar),
                                            Arguments = { 1, 2, 3 } });

它演示了使用构造函数参数和对象初始值设定项来指定类型和参数。使用最适合你的。

答案 1 :(得分:0)

我认为这就是你要求的......(我认为我们的问题的真正答案是在函数参数列表中使用params

实现:

public class ObjectMap
{
    public object[] ActivatedObjects { get; private set; }

    public ObjectMap(params object[][] itemsToMap)
    {
        ActivatedObjects = itemsToMap.Select(ActivateItem).ToArray();
    }

    private object ActivateItem(object[] itemToActivate)
    {
        return Activator.CreateInstance((Type)itemToActivate[0], itemToActivate.Skip(1).ToArray());
    }
}

基本单元测试:

[TestClass]
public class UnitTest3
{
    [TestMethod]
    public void TestMethod1()
    {
        var map = new ObjectMap(new object[] {typeof(Class1)},
                  new object[] {typeof(Class2), "Arg One", 2});

        Assert.AreEqual(2, map.ActivatedObjects.Length);
        Assert.IsInstanceOfType(map.ActivatedObjects[0], typeof(Class1));
        Assert.IsInstanceOfType(map.ActivatedObjects[1], typeof(Class2));
    }
}

public class Class1
{
    public Class1()
    {
    }
}

public class Class2
{
    public Class2(string arg1, int arg2)
    {
    }
}