2011-05-12 2 views
9

개체 속성 인덱서 스타일에 액세스 할 수있는 도구, 라이브러리가 있습니까?C# 개체 속성 인덱서 스타일에 액세스

public class User 
{ 
    public string Name {get;set;} 
} 

User user = new User(); 
user.Name = "John"; 

string name = user["Name"]; 

아마도 여기 동적 키워드가 도움이 될 수 있습니까?

+1

합니다. 왜 이것을하고 싶습니까? –

+0

일부보고 작업을 수행하는 일반적인 방법을 구축하려고합니다. – user256034

답변

3

인덱서에 대해 this을 확인하십시오. 사전은 속성을 사용하는 대신 모든 값과 키를 저장합니다. 이렇게하면 성능 저하없이 런타임에 새 속성을 추가 할 수 있습니다.

public class User 
{ 
    Dictionary<string, string> Values = new Dictionary<string, string>(); 
    public string this[string key] 
     { 
      get 
      { 
       return Values[key]; 
      } 
      set 
      { 
       Values[key] = value; 
      } 
     } 
} 
+0

많은 개체가 있으므로 모든 개체에 대해이를 구현하는 것이 옵션이 아닙니다. – user256034

+0

@ user256034 한 번만 수행하고 속성 대신 값을 사전에 저장하십시오. –

0

리플렉션 및 인덱서를 사용하여 직접 빌드 할 수 있습니다.

하지만 이러한 솔루션이 필요한 이유는 무엇입니까? 당신은 때까지이 작업을 수행 할 수없는이에 대한 인덱스를 사용하려는 경우

PropertyInfo info = user.GetType().GetProperty("Name"); 
    string name = (string)info.GetValue(user, null); 

그리고 그

public object this[string key] 
    { 
     get 
     { 
      PropertyInfo info = this.GetType().GetProperty(key); 
      if(info == null) 
       return null 
      return info.GetValue(this, null); 
     } 
     set 
     { 
      PropertyInfo info = this.GetType().GetProperty(key); 
      if(info != null) 
       info.SetValue(this,value,null); 
     } 
    } 
10

클래스는 Indexer를 구현합니다.

+1

내 실적에 해가되지 않습니까? – user256034

+1

@ user256034 매우 그렇습니다. 그러나 런타임에 속성을 찾는 것은 매우 느립니다. 당신이 그것을 빨리 할 수있는 유일한 방법은 나의 구현이다. –

+0

다이나믹을 사용하는 것만 큼. 역학은 본질적으로 필요에 따라 런타임에 컴파일됩니다. –

1

뭔가를 시도 할 수 있습니다 이름으로 속성 값을 얻기 위해 반사를 사용할 수

2

확실히 DynamicObject를 상속 받아 그렇게 할 수 있습니다.

http://msdn.microsoft.com/en-us/library/system.dynamic.dynamicobject.trygetindex.aspx

만 '객체'를 반환 (그리고 캐스트 할 필요) 또는 클래스에서만 문자열을 가지도록하기 위해 중 하나를 제한 할 다른 사람이 여기에 언급 된 간단한 인덱서 방법을 사용.

: 다른 곳에서 언급했듯이 동적 인 경우에도 TryGetIndex 함수 내부에서 값을 가져 오기 위해 리플렉션 또는 특정 형식의 조회를 사용해야합니다.

+0

예제를 보여 주시겠습니까? – user256034

+0

@ user256034 위의 링크는보기 좋은 예입니다. –

1

당신은 당신이 비슷한 할 리플렉션을 사용할 수있는 문자열 값을 기반으로 속성에 액세스하려면 다음 밖으로 관심

string name = typeof(User).GetProperty("Name").GetValue(user,null).ToString();