2013-05-16 4 views
5

클래스에 속성을 동적으로 추가하고 값을 설정하려고합니다. 어떤 사람이 나를 자습서 나 기사의 올바른 방향으로 가리킬 수 있었는지, 아니면 더 나은 예를 제시 할 수 있습니까?클래스에 동적으로 속성 추가 C#

저는 foreach 루프에서 호출되는 기본 클래스를가집니다. 이 클래스 안에서 최대 30 개의 속성을 추가하고 값을 설정해야합니다.

클래스를 호출하는 메서드입니다. 클래스가 호출되는 내부

foreach (Class name in this.list) 
{ 
    ClassBeingCalled class = new ClassBeingCalled (name); 
    class.Populate(); 
    this.newlist.Add(class); 
} 

지금, 그 클래스의 "채우기"방식으로 설정됩니다 비행에 30 개 정도 특성을 만들어야합니다. 그래서 같이

...

foreach (PropertyToAssign count2 in listofproperties) 
{ 
    string name = "_nameofproperty" + count2.name 
    base.GetType().GetField(name, BindingFlags.NonPublic | 
          BindingFlags.Instance).SetValue(this, count2); 
} 
+1

동적 속성을 만들려고하기보다는 'listofproperties'를 사용하면 무엇이 좋을까요? Dynamic이어야하는 경우 http://msdn.microsoft.com/en-us/library/vstudio/dd264741.aspx – pingoo

+0

을 어떻게 확인합니까? –

+0

그런 것들이 속성으로 존재합니까? 즉, * 새 속성을 만들려고하십니까? 또는 기존 속성에 값을 할당 할 수 있습니까? –

답변

4

이 접근하는 몇 가지 방법이 있습니다.

a) 런타임시 필요에 따라 리플렉션을 사용하여 클래스를 생성합니다. Populate을 포함하는 기본 클래스에서이 생성 된 클래스를 파생시킬 수는 있지만 필요는 없습니다.

b) C# 4.0 이상을 사용하는 경우 ExpandoObject을 사용하면 사용자가 원하는 모든 속성을 설정할 수 있습니다. 이들은 모두 런타임 기반 인 DLR을 사용하기 때문에 이 아니며이 속성 자체로 추가되지 않습니다. 귀하의 필요에 따라 이것은 괜찮을 수 있습니다. 이는 접근 방식 c와 거의 같지만 DLR을 사용합니다.

C) 당신은 백업 사전을 사용과 같이, indexer를 사용할 수는 :

private Dictionary<string, object> _internalData = new Dictionary<string, object>(); 

public T this[string propName] 
{ 
    get { 
     return _internalData[propName]; 
    } 
    set { 
     _internalData[propName] = value; 
    } 
} 

방법 3을 사용하여, 당신은 실제로 아마 더 나은 귀하의 요구 사항을 기반으로 string의 기반으로 색인하고 있습니다. 이 라인을 따라 뭔가를 할 수있는 것처럼 .. : 하루의 끝에서

foreach (PropertyToAssign count2 in listofproperties) 
{ 
    string name = "_nameofproperty" + count2.name; 
    this[name] = count2.value; 
} 

이 문제 you'r를 설명하면, 아마 최선의 그것을 해결하기위한 더 나은 방법이있을 수 있으므로 해결하려고 노력합니다.

+0

위의 작업을 수행 한 것으로 알고 있습니다 :-(다른 정보가 필요합니까? –

+0

클래스에 속성을 설정하는 기존 솔루션을 제안했습니다 실제로 속성을 추가해야한다고 말했고 실제로는 옵션 C를 살펴보고 속성을 설정하는 대신 내부 사전에 값을 설정하면됩니다. –

+0

어떻게하면 좋을까요? –

1

컴파일 된 클래스에 동적 속성을 즉시 추가 할 수 없습니다. Reflection.Emit

다른 옵션은 사전 또는 ExpandoObject (실제로는 사전입니다)을 사용하고있을 수 있습니다. 그러나이 옵션의 경우 리플렉션을 사용하여 동적 속성에 액세스 할 수 없습니다.

관련 문제