2013-10-10 22 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

它我可以將它轉換爲另一個類中的方法,它將只在新的ObjectMap對象中設置值。這將允許一個解決方案? – Villermen

+0

我這麼認爲,但我相信下面的解決方案可能是您最好的選擇。 –

回答

6

我建議你封裝「類型和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 } }); 

,演示了同時使用構造函數的參數和對象初始化指定類型和參數。使用最適合你的方式。

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

基本單元測試:

[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

注意:我支持Jon Skeet提出的將參數設置爲類的建議,但由於您的問題中包含數組,因此我堅持使用數組。使用無類型數組肯定更容易出錯,並且我知道我沒有添加任何錯誤處理。我只是提供一個基於數組創建實例的實現。 – CodingWithSpike

相關問題