1

さまざまなタイプのオブジェクトにデータ行を入力し、関連するオブジェクトの各属性=データ行の同様の名前フィールドに入力します。

これを行うには、ジェネリック関数を使用したいと思います。ジェネリック関数からリターンオブジェクトのタイプを強制するにはどうすればよいですか。<T>構文が実際に 何を意味するのかまだわかりません:PopulateObject<T>コンパイラエラーが発生したため、型を返しません-型'object'を'JobCard'に暗黙的に変換できません以下のコードを参照してください

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;
}

----2番目の回答後に更新----

このコードの使用:private 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;
}

しかし、私は別の障害にぶつかりました。属性の1つは、実際にはCustomerと呼ばれる別のオブジェクトであり、独自の11個の属性があります。ネストされたオブジェクトがまだ潜んでいるのではないかと思います。データ行にフィールドが1つしかない、これらのネストされたオブジェクトの入力をどのように処理しますか?

これらのオブジェクトを処理するには:-親ObjdataでChildObjタイプを抽出する必要があります-ChildObjTypeと完全なデータ行を渡すProcessChildObj()関数を呼び出します-そしてProcessChildObj()で名前を一致させ、設定しますその属性?

または(上記のコードのように)-PopulateObjectを再帰的に呼び出します。ただし、obj型を再帰呼び出しに渡そうとするとコンパイラが文句を言うので、これには問題があります。

propertyitem.SetValue(dataObj、PopulateObject(propertyitem、dataRow)、null); //コンパイラメッセージ「Operator'<'はタイプ'methodgroup'および'System.type'のオペランドに適用できません」を引き起こします

ネストされたchildObjのタイプを抽出して、そのタイプをパラメーターとして渡すにはどうすればよいですか?

4

2 に答える 2

1

メソッドのシグネチャを次のように変更します。

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

また、既存のオブジェクトを更新するだけなので、オブジェクトを返す必要はないと思います。あなたはただ使うことができます:

private void PopulateObject(object dataObj, System.Data.DataRow dataRow)
于 2009-05-25T11:15:01.683 に答える
0

返品します...なぜ返品するのですか?あなたはすでにそれを更新しています...発信者は変更を見るでしょう。また、メソッドでジェネリックを使用していない場合 (使用していない場合) は、objectジェネリックを使用しないでください。

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

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

こちらの投稿もご覧になるといいかもしれません。

于 2009-05-25T11:16:46.313 に答える