C# 将要创建的带有参数的对象列表传递给构造函数或方法

C# 将要创建的带有参数的对象列表传递给构造函数或方法,c#,constructor,activator,C#,Constructor,Activator,基本上,我要做的是创建一个类,它可以使用 Activator.CreateInstance(Type type, params object[] args) 我需要将所有对象蓝图传递给名为ObjectMap的类的构造函数。它需要是一对类型和参数。如果允许解决方案,它也可以是另一个类中的方法,而不是构造函数 有点像 new ObjectMap([Type, somevalue, somevalue, somevalue], [Type, somevalue], [Type] ...) 或 我不

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

Activator.CreateInstance(Type type, params object[] args)
我需要将所有对象蓝图传递给名为ObjectMap的类的构造函数。它需要是一对类型和参数。如果允许解决方案,它也可以是另一个类中的方法,而不是构造函数

有点像

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

我不知道如何使它,使您可以通过一个可变数量的参数(甚至0)的可变数量的对。见鬼,我甚至很难解释这个问题。问我任何你不清楚的事


Gr.Viller

我建议您将“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();
    }
}
并称之为:

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

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

我建议您将“类型和参数”封装到特定类型中。。。然后您可以使用它的
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();
    }
}
并称之为:

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

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

我想这就是你想要的。。。(我认为我们问题的真正答案是在函数参数列表中使用
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)
    {
    }
}

我想这就是你想要的。。。(我认为我们问题的真正答案是在函数参数列表中使用
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)
    {
    }
}

很不清楚。。。但通常,在构造函数中必须始终使用相同数量的参数,即使某些参数可能为null。我可以将其转换为另一个类中的方法,该方法只需在新的ObjectMap对象中设置值。这会带来一个解决方案吗?我想是的,但我相信下面的解决方案可能是你最好的选择。它很不清楚。。。但通常,在构造函数中必须始终使用相同数量的参数,即使某些参数可能为null。我可以将其转换为另一个类中的方法,该方法只需在新的ObjectMap对象中设置值。这会带来一个解决方案吗?我想是的,但我相信下面的解决方案可能是你最好的选择。这正是我所寻找的,我没有想到的。非常感谢这正是我想要的,我没有想到的。非常感谢注意:我支持Jon Skeet关于将参数设置为类的建议,但由于您的问题中包含数组,因此我坚持使用数组。使用非类型化数组肯定更容易出错,我知道我没有添加任何错误处理。我只是提供了一个基于数组创建实例的实现。注意:我支持Jon Skeet关于将参数设置为类的建议,但由于您的问题中包含数组,所以我坚持使用数组。使用非类型化数组肯定更容易出错,我知道我没有添加任何错误处理。我只是提供了一个基于数组创建实例的实现。