2009-05-25 18 views
1

私は、関連するオブジェクトの各属性が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のタイプを抽出すればよいですか?

答えて

1
にあなたのメソッドのシグネチャを変更し

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

また、私はあなたが唯一の既存のオブジェクトを更新するので、任意のオブジェクトを返す必要はありませんだと思います。あなただけ使用することができます。

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

再はそれを返す... なぜリターンそれ?あなたは既にそれを更新しました...発信者は変更を見るでしょう。あなたがこの方法でジェネリックを使用していない場合(あなたはそうではありません)、単にobjectを使用し、ジェネリックは使用しないでください。

コード自体が機能しない場合、私は最大の問題ではなく、プロパティ値を評価するよりも、文字列「propertyitem.Name」を使用していると思わ:propertyitem.Name

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

あなたがしたいことthis postもご覧ください。

+0

あなたは正しいです、私はコードを実行したときにそれを発見しました。今のところ働いていますか? – callisto