2013-10-10 6 views
0

В основном то, что я пытаюсь сделать, это класс, который может массово создавать объекты с помощьюсписок Передача объектов для создания с аргументами конструктора или метода

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

+0

Его довольно неясные ... но, как правило, вы должны всегда использовать одинаковое количество аргументов в конструкторе, даже если некоторые из них могут быть нулевыми –

+0

It возможно для меня превратить его в метод другого класса, который просто установит значения в новом объекте ObjectMap. Будет ли это решение? – Villermen

+0

Я так думаю, но я считаю, что решение ниже, вероятно, лучший выбор. –

ответ

6

Я хотел бы предложить вам инкапсулировать «типа и арг» в определенный тип ... то вы можете использовать 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 } }); 

Это демонстрирует, используя оба параметра конструктора и инициализаторы объектов, чтобы указать тип и аргументы. Используйте то, что лучше для вас.

+0

Это именно то, что я искал и не думал. Огромное спасибо! =) – Villermen

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()); 
    } 
} 

Basic модульное тестирование:

[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) 
    { 
    } 
} 
+0

Примечание: Я поддерживаю предложение Джона Скита, чтобы сделать параметры классом, но так как в вашем вопросе были массивы, я застрял в массивах. Использование нетипизированных массивов, безусловно, больше подвержено ошибкам, и я знаю, что я не добавлял ошибок при обработке ошибок. Я просто предоставлял реализацию, которая создавала экземпляры на основе массивов. – CodingWithSpike