관련 객체의 각 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의 유형을 추출하려면 어떻게합니까?
맞습니다. 코드를 실행했을 때 그 점을 발견했습니다. 지금 일하는 중입니다. – callisto