2011-03-17 43 views
1

我有一个数组可以有1到10个值的数组。根据数组中值的数量,我想选择10个不同类中的1个,并将数组的值放入类对象中。如何根据数组填充类?

这是我到目前为止,

Array[] ar; 
ar = PopulateTheArray(); 
int cnt = ar.Count(); 
Object ob = Activator.CreateInstance(null, "MyObject" + cnt); 

有10个为MyObject类这样的,

public class MyObject1 
{ 
    public string Column1 { get; set; } 
} 
public class MyObject2 
{ 
    public string Column1 { get; set; } 
    public string Column2 { get; set; } 
} 
public class MyObject3 
{ 
    public string Column1 { get; set; } 
    public string Column2 { get; set; } 
    public string Column3 { get; set; } 
} 
and so on..... 

如何循环扔阵列来填充对象,因为对象是动态创建?

+3

这是一个家庭作业的问题? – 2011-03-17 21:50:55

+3

你想完成什么,或者这是一项家庭作业? – 2011-03-17 21:51:04

+0

我希望这是作业,我还没有牢牢掌握动态构建或如何访问它们。 – Tim 2011-03-17 21:54:02

回答

1

这个类架构确实看起来很奇怪。看起来你有一个约定那个类MyObjectX将具有名为Column1 - ColumnX的X属性。我从来没有见过这种情况,我也不会想到任何适合的情况。

无论如何,我强烈建议你描述你的问题领域和你当前的架构,以便其他人可以评估它的适当性,并可能提出替代方案。例如,它可能只需要编写一个类,它封装一个数组(或者一些其他集合):

public class MyObject 
{ 
    public string[] Columns { get; private set;} 

    public MyObject(int numColumns) 
    { 
     Columns = new string[numColumns]; 
    } 
} 

但我会尽量回答的问题是问。

你可以做这样的事情:

object ob = ... 
object[] ar = ... 

for (int i = 0; i < ar.Length; i++) 
{ 
    ob.GetType().GetProperty("Column" + i).SetValue(ob, ar[i], null); 
} 
0

如果你有一个抽象基类?

public abstract class MyObjectBase 
{ 
    public abstract void Initialize(params object[] args); 
} 

然后你的例子就变成:

public class MyObject1 : MyObjectBase 
{ 
    public string Column1 { get; set; } 
    public override void Initialize(params object[] args) 
    { 
     this.Column1 = args[0]; 
    } 
} 
public class MyObject2 : MyObjectBase 
{ 
    public string Column1 { get; set; } 
    public string Column2 { get; set; } 
    public override void Initialize(params object[] args) 
    { 
     this.Column1 = args[0]; 
     this.Column2 = args[1]; 
    } 
} 
public class MyObject3 : MyObjectBase 
{ 
    public string Column1 { get; set; } 
    public string Column2 { get; set; } 
    public string Column3 { get; set; } 
    public override void Initialize(params object[] args) 
    { 
     this.Column1 = args[0]; 
     this.Column2 = args[1]; 
     this.Column3 = args[2]; 
    } 
} 
and so on..... 

调用,像这样:

Array[] ar; 
int cnt = ar.Count(); 
MyObjectBase ob = Activator.CreateInstance(null, "MyObject" + cnt); 
ob.Initialize(ar); 
+0

没有想到这一点,我可能会为我工作 – Tim 2011-03-17 22:03:29

+0

“参数”可能没有必要,但它是一个非常通用的例子:P – mikesigs 2011-03-17 22:05:43

0

尝试......

public interface IMyObject 
{ 

} 

public class MyObject1 : IMyObject 
{ 
    public string Column1 { get; set; } 
} 
public class MyObject2 : IMyObject 
{ 
    public string Column1 { get; set; } 
    public string Column2 { get; set; } 
} 
public class MyObject3 : IMyObject 
{ 
    public string Column1 { get; set; } 
    public string Column2 { get; set; } 
    public string Column3 { get; set; } 
} 

接口IMyObject标识你的类。现在,动态地创建与反思...

var assemblyTypes = System.Reflection.Assembly.GetExecutingAssembly().GetTypes(); 
var instanceList = new List<IMyObject>(); 
foreach (Type currentType in assemblyTypes) 
{ 
    if (currentType.GetInterface("IMyObject") == null) 
    continue; 

    Console.WriteLine("Found type: {0}", currentType); 
    // create instance and add to list 
    instanceList.Add(Activator.CreateInstance(currentType) as IMyObject); 
} 

希望这将有助于