2011-03-17 4 views
1

데이터에 1 ~ 10 개의 값을 가질 수있는 데이터 배열이 있습니다. 배열의 값 수에 따라 10 개의 다른 클래스 중 1 개를 선택하고 배열의 값을 클래스 객체에 배치하려고합니다. 나는 루프는 객체이기 때문에, 객체를 채울 배열을 던졌다 어떻게이 추천을 MyObject 클래스가 있습니다 이것은 내가 지금까지 무엇을 가지고배열을 기반으로 클래스를 채우려면 어떻게해야합니까?

,

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

,

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

이 숙제 문제를 도움이 될 것입니다

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

희망을 만들? –

+3

성취하려는 것은 무엇입니까, 아니면 숙제입니까? –

+0

숙제 였으면 좋았을 텐데, 나는 이것을 역동적으로 구축하거나 액세스하는 방법에 대해 확고한 이해를 아직 가지고 있지 않습니다. – Tim

답변

1

이 클래스 아키텍처는 실제로 매우 이상하게 보입니다. MyObjectX 클래스가 Column1-이라는 정확히 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

+0

"params"는 아마도 필요하지는 않지만 꽤 일반적인 예 : P – mikesigs

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이 클래스를 식별합니다. 이제 ... 반사 동적으로이

관련 문제