2013-10-21 52 views
0

我想了解如何從外部類初始化數組對象。請參考下面的代碼:初始化不同類中的數組對象C#

Class C 
{ 
    private string name { get; set; } 
    private string value { get; set; } 
} 

Class B 
{ 
    private C[] field; 
    public C[] Field { get; set; }; 
} 

Class Program 
{ 
    public static void Main(string[] args) 
    { 
     B b = new B(); 
     /* my question was how to initialize this array object inside B class */ 
     b.Field = new C[1]; 
     b.Field[0] = new C(); 
     /* Now I can access b.Field[0].name */ 
    } 
} 

請注意,我不能改變類B和C,因爲它們已經提供給我。謝謝你的幫助。

+0

是否沒有'C'的構造函數可以使用? –

+0

如果你不能更改'C'的公共接口,這可能會有所幫助:http://stackoverflow.com/questions/934930/can-i-change-a-private-readonly-field-in-c-sharp -using-reflection –

+0

不幸的是,我不能修改C類或B類。:( – user759913

回答

2

首先,您不能修改C之外的名稱和值屬性,因爲它們是私有的。
將您的名稱和值屬性公開後,您可以按如下方式實例化您的數組。

B b = new B(); 
b.Field = new C[] {new C {name = "lorem", value = "ipsum"}, new C {name = "dolor", value = "sit"}}; 

如果您使用Reflection,請按如下所示通過工廠創建C對象。

public class CFactory 
{ 
    public C Create(string name, string value) 
    { 
     C result = new C(); 
     var props = result.GetType().GetProperties(BindingFlags.NonPublic | BindingFlags.Public 
               | BindingFlags.Instance | BindingFlags.Static); 

     var nameProp = props.FirstOrDefault(p => p.Name == "name"); 
     var valProp = props.FirstOrDefault(p => p.Name == "value"); 

     if (nameProp != null) nameProp.SetValue(result, name); 
     if (valProp != null) valProp.SetValue(result, value); 

     return result; 
    } 
} 

並使用它;

B b = new B(); 
var fac = new CFactory(); 
b.Field = new C[] {fac.Create("lorem", "ipsum"), fac.Create("dolor", "sit")};