2009-05-25 4 views
1

관련 객체의 각 attrivute와 함께 datarows로 여러 유형의 객체를 채우고 있습니다. = datarow의 이름 필드와 유사합니다.반사 - 설정 반환되는 객체 유형?

이 작업을 위해 제네릭 함수를 사용하고 싶습니다. 반환 객체의 유형을 제네릭 함수에서 강제로 어떻게 만듭니 까? 나는 아직 <T> 구문이 실제로 무엇을 의미하는지 모르겠어요 - 암시

public JobCard AcceptJobCard(Guid jobCardGuid, Guid userGuid) 
{ 
    try 
    { 
     JobCard jc= new JobCard(); 
     DL_ISMS.DataSets.JobCardDS.View_JobcardDataTable dtJC = BL_ISMS.Meter.JobCard_CB.FetchJobCard(jobCardGuid); 
     DL_ISMS.DataSets.JobCardDS.View_JobcardRow jcRow = dtJC[0]; 



     DateTime dateAccept = DateTime.Now; 
     bool res = BL_ISMS.Meter.JobCard_CB.UpdatePdaJobCard(userGuid, jobCardGuid, null, null, null, JobCardStatus.Accepted.GetHashCode(), null, null, null, null, "", "", "", "", "", "", null, dateAccept, null, null, null, null, null, null); 

     if (res) 
     {     
      jc = PopulateObject<JobCard>(jc, jcRow); 

      return jc; 
     } 
     else 
     return jc; 
    } 
    catch (Exception ex) 
    { 
     Trace.WriteException(ex); 
     throw; 
    } 
} 

private object PopulateObject<T>(object dataObj, System.Data.DataRow dataRow) 
{ 

    Type type = dataObj.GetType(); 
    System.Reflection.PropertyInfo[] proplist = type.GetProperties(); 
    string s = ""; 
    foreach (System.Reflection.PropertyInfo propertyitem in proplist) 
    { 
     s += propertyitem.Name + ":" + (propertyitem.GetValue(dataObj,null)).ToString() + "\r\n"; 
     propertyitem.SetValue(dataObj, dataRow["propertyitem.Name"], null); 
    } 
    return (T)dataObj; 
} 

아래에있는 내 코드를 참조하십시오 '작 w +' 에 유형 '개체'로 변환 할 수 없습니다 내가 컴파일러 오류로 PopulateObject<T>이 유형을 반환하지 않습니다 - 개인 T PopulateObject (T dataObj, System.Data.DataRow DataRow를) {

System.Reflection.PropertyInfo[] proplist = dataObj.GetType().GetProperties(); 

    foreach (System.Reflection.PropertyInfo propertyitem in proplist) 
    { 
     if(propertyitem.Name != "") 
      try 
      { 
       propertyitem.SetValue(dataObj, dataRow[propertyitem.Name], null); 
      } 
      catch (Exception ex) 
      { 
       if (ex.Message.Contains("does not belong to table")) 
       { 
        propertyitem.SetValue(dataObj, PopulateObject<propertyitem.GetType()>(propertyitem, dataRow), null); 
       } 
       else 
       throw; 
      } 
    } 
    return dataObj; 
} 
: ---이 코드를 사용하여 ----

2 대답 한 후 업데이트

나는 또 다른 장애물을 쳤다. 속성 중 하나는 실제로 고객이라는 11 개의 속성이있는 또 다른 객체입니다. 나는 아직도 더 숨겨진 중첩 된 객체가 있다고 의심한다. datarow에 필드가 하나 뿐인이 중첩 된 객체의 채우기를 처리하는 방법은 무엇입니까?

이러한 개체 처리하려면 : 를 - 나는 ChildObjType, 그리고 전체의 DataRow 전달하는 ProcessChildObj() 함수를 호출 - - 나는 부모 Objdata 에 ChildObj 유형을 추출해야 할 것와 ProcessChildObj에서을() 이름 일치를하고 속성을 설정합니까?

또는 (위의 코드와 동일) - PopulateObject를 재귀 적으로 호출하십시오. 그러나 이것은 컴파일러가 재귀 호출에 obj 유형을 전달하려고 시도 할 때 불평하는 문제가됩니다.

propertyitem.SetValue (dataObj, PopulateObject (propertyitem, dataRow), null); // 연산자 "< '을'method group '및'System.type '유형의 피연산자에 적용 할 수 없습니다."

유형을 매개 변수로 전달하는 중첩 된 childObj의 유형을 추출하려면 어떻게합니까?

답변

1
가 당신의 메소드의 서명을 변경

: 또한

private T PopulateObject<T>(T dataObj, System.Data.DataRow dataRow) 

, 나는 당신이 당신은 기존 개체를 업데이트하기 때문에 어떤 객체를 반환 할 필요가 없습니다 생각합니다. 당신은 사용할 수 있습니다

private void PopulateObject(object dataObj, System.Data.DataRow dataRow) 
0

다시 그것을 반환 ... 반환 그것? 이미 업데이트했습니다 ... 발신자가 변경 사항을 확인합니다. 그리고 만약 당신이 제네릭을 사용하지 않는다면 (당신은 아님) 단지 object을 사용하고 generics는 사용하지 마십시오. propertyitem.Name :

propertyitem.SetValue(dataObj, dataRow[propertyitem.Name], null); // no quotes 

당신은 할 수 있습니다

코드 자체가 작동하지 않는 경우

, 나는 가장 큰 문제는 문자열 "propertyitem.Name"을 사용하기보다는 속성 값을 평가하고 생각 this post도보십시오.

+0

맞습니다. 코드를 실행했을 때 그 점을 발견했습니다. 지금 일하는 중입니다. – callisto