我使用数据行填充不同类型的对象,每个属性相关对象=数据行中类似的名称字段。
我想使用通用函数来执行此操作。如何从泛型函数强制返回对象的类型。我还不知道<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); //导致编译器消息“运算符”&lt;'不能应用于'方法组'和'System.type'“
类型的操作数如何提取嵌套的childObj的类型以将类型作为参数传递?
答案 0 :(得分:1)
将方法的签名更改为:
private T PopulateObject<T>(T dataObj, System.Data.DataRow dataRow)
此外,我认为您不需要返回任何对象,因为您只更新现有对象。你可以使用:
private void PopulateObject(object dataObj, System.Data.DataRow dataRow)
答案 1 :(得分:0)
重新归还... 为什么返回它?您已经更新了...调用者将看到更改。如果你没有在方法中使用泛型(你不是),只使用object
而不是泛型。
如果代码本身不起作用,我认为最大的问题是使用字符串“propertyitem.Name”,而不是评估属性值:propertyitem.Name
:
propertyitem.SetValue(dataObj, dataRow[propertyitem.Name], null); // no quotes
您也可以查看this post。