私は、関連するオブジェクトの各属性がdatarowの名前と同じフィールドにあるdatarowsを使用して、異なるタイプのオブジェクトを設定しています。反射設定戻り値の型obj?
これを行うには汎用関数を使用したいと思います。戻り値オブジェクトの型を汎用関数から強制するにはどうすればよいですか。私はまだ<T>
構文が実際に何を意味するのか分からない。私は、コンパイラのエラーを取得するよう PopulateObject<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;
}
以下の私のコードを参照してください 「ジョブ・カード」に型「オブジェクト」に変換できません - プライベート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解答後に更新
私は別のロードブロッキングを打った。属性の1つは実際にはCustomerという別のオブジェクトであり、11の属性は独自のものです。私はまだネストされたオブジェクトがまだ潜んでいると思う。 datarowにフィールドが1つしかない、これらのネストされたオブジェクトの移入をどのように処理できますか。これらのオブジェクト処理するには
: を - 私は親Objdata にChildObjタイプを抽出する必要があるだろう - これは私がChildObjTypeを渡すためにProcessChildObj()関数を呼び出し、そして完全なのDataRow - (とProcessChildObj中)名前の一致を行い、その属性を設定しますか?
または(上のコードのように) - PopulateObjectを再帰的に呼び出します。しかしこれは、コンパイラが再帰呼び出しにobj型を渡そうとするところで文句を言うにつれ、私に問題を提示します:
propertyitem.SetValue(dataObj、PopulateObject(propertyitem、dataRow)、null); //演算子 '<'は 'メソッドグループ'と 'システムタイプ'タイプのオペランドに適用できません "
タイプをパラメータとして渡すには、どのように入れ子になったchildObjのタイプを抽出すればよいですか?
あなたは正しいです、私はコードを実行したときにそれを発見しました。今のところ働いていますか? – callisto