代码之家  ›  专栏  ›  技术社区  ›  callisto

反射-设置返回的obj的类型?

  •  1
  • callisto  · 技术社区  · 17 年前

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

    ----在第二次回答后更新----

        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个属性。我怀疑还有更多的嵌套对象仍然潜伏着。

    2 回复  |  直到 17 年前
        1
  •  1
  •   bruno conde    17 年前

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

    private void PopulateObject(object dataObj, System.Data.DataRow dataRow)
    
        2
  •  0
  •   Community Mohan Dere    9 年前

    重新返回。。。 归还?您已经更新了它…呼叫者将看到更改。如果你没有在方法中使用泛型(你没有),就使用 object

    如果代码本身不起作用,我认为最大的问题是使用 字符串 “propertyitem.Name”,而不是计算属性值: propertyitem.Name

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

    this post