我有一组数据,其中可以包含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.....
如何循环抛出数组来填充对象,因为对象是动态创建的?
答案 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);
}
希望这会有所帮助