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

----第二个答案后更新----

使用此代码: 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;
}

不过,我遇到了另一个障碍。其中一个属性实际上是另一个名为 Customer 的对象,它拥有 11 个属性。我怀疑还有更多的嵌套对象仍然潜伏着。我将如何处理这些嵌套对象的填充,数据行中只有 1 个字段?

要处理这些对象: - 我必须在父 Objdata 中提取 ChildObj 类型 - 调用我将 ChildObjType 和完整数据行传递给的 ProcessChildObj() 函数 - 并在 ProcessChildObj() 中进行名称匹配,并设置那个属性?

或(如上面的代码) - 递归调用 PopulateObject。然而,这给我带来了一个问题,因为编译器抱怨我尝试将 obj 类型传递给递归调用:

propertyitem.SetValue(dataObj, PopulateObject(propertyitem, dataRow), null); //导致编译器消息“运算符'<'不能应用于'方法组'和'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 回答