如何基于数组填充类?

时间:2011-03-17 21:48:57

标签: c# arrays

我有一组数据,其中可以包含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 个答案:

答案 0 :(得分:1)

这个类架构确实看起来很奇怪。您似乎有一个约定,类MyObjectX将具有名为Column1的完全X属性 - ColumnX。我以前从未见过这种情况,也无法想到任何适合的情况。

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

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

答案 1 :(得分: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);

答案 2 :(得分: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识别您的类。现在使用Reflection ...动态创建

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

希望这会有所帮助