2012-09-19 5 views
0

런타임에 유형에 대한 속성을 만들 수 있습니까? 내 "Account"는 "ID"와 "Account Name"을 가지고 있으며, INotifyPropertyChanged를 구현하는 속성의 미리 정의 된 묶음을 가지고 있습니다. 런타임시이 유형에 속성을 추가하려고 했으므로 getter와 setter 및 setter가 메서드를 호출합니다. 그것을 전달 통보하는 것은 예,하지만 "정상"CLR 유형런타임에 속성 생성

public string Name 
{ 
    get { return _name; } 
    set 
    { 
      _name = value; 
      NotifyPropertyChanged("Name"); 
    } 
} 
+1

? 'DataTable'을 다시 발명하려고하십니까? – SLaks

+0

기본적으로 데이터 저장소에서 데이터를 보내고 고정 된 열 패킷과 다양한 패킷을받습니다. 어떻게하면 다양한 패킷을 처리 할 수 ​​있는지 모르겠다. – Andy

+0

사용중인 .Net의 버전은 무엇입니까? – Artemix

답변

1

즉, 속성 이름입니다. 당신이 사용할 수 있습니다 DynamicObject

DynamicObject 구현하는 클래스의 제공 예제 코드에 봐

public class DynamicDictionary : DynamicObject 
{ 
    ... 
} 

같은 후에 : 당신은 그 종류가 특히 그런 기능을 만들었습니다 실제로 그것을 달성 할 수 예 :

dynamic person = new DynamicDictionary(); 

// Adding new dynamic properties.  
person.FirstName = "Ellen"; 
person.LastName = "Adams"; 
+0

그는 그것을 속이고'public string this [string propertyName] {get {} set {}}'을 사용하여 get과 set이 사전으로부터 속성을 가져올 곳을 사용할 수 있습니까? –

+0

네,하지만이 클래스를 구현하면 DLR에서 더 많은 잠재력을 얻을 수 있습니다. – Tigran

0

동적 개체를 사용하거나 확장 메서드를 통해 동작을 확장하십시오. 나는 다른 옵션을 모른다. C#을가 DynamicObject

과 질문에 같은 다른 속성을 저장할 수

당신은 클래스와 같은 사전을 만들 수 있습니다, 객체와

-1

아니, 그 수 없습니다 당신이 새로운 클래스의 유형을 창조하고있다 할 수있다 반사에 의해, 그리고 그들은 새로운 속성을 포함 할 수 있습니다. 그러나 쉽게 액세스 할 수는 없습니다.

+0

downvoting하는 경우 의견을 추가하십시오, 정답입니다. – user287107

0

Reflection.Emit을 사용하면 클래스에서 상속 한 새 클래스를 동적으로 만들고 해당 새 유형에 속성을 추가 할 수 있습니다. 자신의 유형을 상속하므로 해당 유형의 "확장자"로 간주 될 수 있습니다.

이 경로는 복잡한 코드이므로 작업 완료 후 다시는 이해할 수없는 코드가 생성 될 것입니다.

MSIL 코드의 작동 방식은입니다. 조금 이상하고 반전 된 것입니다. 당신은 C#과 같은 언어로 당신이 기대할 수있는 아주 오래된 방법을 사용해야합니다. 스택에서 값을 push하여 함수의 인수로 전달해야하며, 함수에서 사용하지 않은 반환 값을 반드시 삭제해야합니다.

이 하나에 떨어지는 전에 다른 대안을 고려)

그리고 은 YES, 나는 그런 고통스러운 방법입니다 ...이의 당신이 두려워 만들려고 노력하고 있습니다.

재료의 많은이 문제에 SO 이미 있습니다 : https://stackoverflow.com/questions/tagged/reflection.emit

CodeProject의 기사 설명 Reflection.Emit를 : 당신이 달성하려고하는 무엇 Dynamic Type Using Reflection.Emit

관련 문제