与相关对象的每个数据行attrivute

我填充不同类型的对象=与similiarly名称字段中数据行。

我想使用一个通用的函数来做到这一点。如何强制返回的对象的类型从泛型函数。我还不知道是什么<T>语法实际上意味着:  我得到编译器错误PopulateObject<T>没有返回类型 - 无法键入“对象”隐式转换为“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;
}

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

使用此代码: 私人牛逼PopulateObject(T dataObj,数据行的System.Data.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;
}

我虽然击中另一个路障。其中一个属性其实就是所谓的客户,有它自己的11个属性的另一个对象。我怀疑甚至有仍然潜伏多个嵌套对象。 我将如何处理这些嵌套对象的填充,对他们来说,只有1 DataRow字段?

要处理这些对象: - 我不得不提取父ChildObj型Objdata - 打电话给我传递一个ProcessChildObj()函数ChildObjType,以及完整的数据行 - 在ProcessChildObj()做一个名字匹配,并设置属性

或(如在上面的代码中) - 呼叫PopulateObject递归。然而,这给我看一个问题,因为编译器会抱怨,我尝试obj的类型传递到递归调用:

propertyitem.SetValue(dataObj,PopulateObject(propertyitem,数据行),NULL); //导致编译MSG“操作员‘<’不能被施加到型‘方法组’和‘的System.Type’的操作数”

如何提取嵌套childObj的类型传递类型作为参数?

有帮助吗?

解决方案

你的方法的签名更改为:

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

另外,我觉得你不需要返回任何对象,因为你只更新现有对象。你可以使用:

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

其他提示

重新返回它... 为什么退货吗?你已经更新吧...主叫方将看到的变化。并且如果未在该方法中使用泛型(你不是)只使用object和没有泛型。

如果代码本身不能正常工作,我认为最大的问题是使用的字符串“propertyitem.Name”,而不是评估属性值:propertyitem.Name

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

您可能想看看这个帖子

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top