2012-10-10 3 views
1

사용자 지정 클래스 속성 집합이 있습니다. 각 속성의 이름은 데이터베이스의 값과 동일합니다. 내가 뭘하고 싶은지 동적으로 스위치를 기반으로 각 속성에 대한 값을 설정합니다. 사용자 지정 클래스 속성 - 동적 참조

사용자 지정 속성

은 다음과 같이 보일 :

class MyDEF 
{ 

    #region Variable Declaration Section.... 

    private string _ABC01; 
    private string _ABC02; 
    private string _ABC03; 
    private string _ABC04; 

    #endregion 

    #region Property Declaration Section 

    public string ABC01 
    { 
     get { return _ABC01; } 
     set { _ABC01= value; } 
    } 

    public string ABC02 
    { 
     get { return _ABC02; } 
     set { _ABC02= value; } 
    } 

    public string ABC03 
    { 
     get { return _ABC03; } 
     set { _ABC03= value; } 
    } 

    public string ABC04 
    { 
     get { return _ABC04; } 
     set { _ABC04= value; } 
    } 

    #endregion 
} 

그런 다음 값의 코드 로딩과 같이 보인다 :

foreach (DataRow dr in dataTable.Rows) 
      { 
       ED = dr["FieldDesc"].ToString(); 

    switch (ED) 
    { 
          case "ABC01": 
           ratesVO.ABC01 = dr["DefaultValue"].ToString(); 
           break; 
          case "ABC02": 
           ratesVO.ABC02 = dr["DefaultValue"].ToString(); 
           break; 
          case "ABC03": 
           ratesVO.ABC03 = dr["DefaultValue"].ToString(); 
           break; 
          case "ABC04": 
           ratesVO.ABC04 = dr["DefaultValue"].ToString(); 
           break; 
    } 
    } 

을 내가 달성하고자하는 것은 무엇인가와 같은 :

foreach (DataRow dr in dataTable.Rows) 
    { 
       ED = dr["FieldDesc"].ToString(); 
       MyCustomProperty.ED = dr["DefaultValue"].ToString(); 
    } 

이것이 가능합니까? 그렇다면 예제 또는 참조를 제공해주십시오.

답변

1

동적 속성 이름에 따라 값을 설정 Reflection를 사용할 수 있습니다

무엇 당신이 할 수있는
foreach (DataRow dr in dataTable.Rows) 
{ 
    ED = dr["FieldDesc"].ToString(); 
    ratesVO.GetType().GetProperty(ED) 
        .SetValue(ratesVO, dr["DefaultValue"].ToString()); 
} 
+0

ㅎ; "PropertyInfo.SetValue는 세 번째 매개 변수가 필요합니다"라고 말하려고했으나 마침내 SetValue (obj, value) 오버로드가 추가 된 것처럼 보입니다 (.NET 4.5). –

+0

@MarcGravell : 예, correct –

+0

아마도 ratesVO를 올바르게 선언하지 않을 것입니다. 왜냐하면 내가 rateVO라고 입력했기 때문이야. 내가 본 모든 것은 특성입니다. GetType 메서드 나 다른 메서드가 전혀 표시되지 않습니다. – Darkman

0

는이 같은 데이터 테이블에 선택을 수행합니다. (이것은 당신이 그것을 수정해야 할 수도 있습니다,하지만 완벽한 코드가 아닙니다.) 무슨 얘기하는 것은 (간체) 반사, 기본적으로

DataRow[] result = table.Select("FieldDesc='<Required property>'"); 
     return result[0]["DefaultValue"] 
1

입니다 :

그러나
string propertyName = (string)dr["FieldDesc"]; 
object value = dr["DefaultValue"]; 
// assign 
obj.GetType().GetProperty(propertyName).SetValue(obj, value, null); 

, 반사 성능에 영향을가 ; 드물게 사용하는 것이 좋지만 데이터 액세스 루프의 일부로 이것은 실제로 여러분을 해칠 수 있습니다. 이 훨씬의 성능을 향상시키기 위해 라이브러리 지원 등 FastMember 사용을 고려할 수 :

var wrapped = ObjectWrapper.Create(obj); 
... 
wrapped[propertyName] = value; 

나는 것, 그러나, DataTable로 작은 값 로딩 일들이 단지 객체 모델로 밀어 있다는 것을 말한다. 데이터 판독기 API에서 직접 작업 할 수도 있습니다.

+0

감사합니다 -이 코드는 드물게 사용되었습니다 (한 달에 한두 번). – Darkman