1

基本上我想做的是创建一个可以使用大量创建对象的类

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

格维勒

4

2 回答 2

8

我建议你将“类型和参数”封装成一个特定的类型......然后你可以使用一个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 } });

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

于 2013-10-10T21:34:04.573 回答
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)
    {
    }
}
于 2013-10-10T21:46:09.533 回答