【发布时间】:2011-11-15 19:31:36
【问题描述】:
我什至不确定如何描述我正在尝试做的事情(抱歉,新手),但是因为我还没有弄清楚如何正确地做而复制代码在我的列表中并不重要。请帮忙?
原始的非泛型方法:
public static string SerializetaUpdateCreateItemRcd(IVItemMasterType o)
{
eConnectType eConnect = new eConnectType();
IVItemMasterType[] myMaster = { o };
// Populate the eConnectType object with the schema object
eConnect.IVItemMasterType = myMaster;
return MemoryStreamSerializer(eConnect);
}
我对通用的尝试,如此接近,在设置类型属性时迷失了(?):
public static string Serialize<T>(T o) where T : eConnectType
{
eConnectType eConnect = new eConnectType();
T[] myMaster = { o };
// Populate the eConnectType object with the schema object
eConnect.? = myMaster;
return MemoryStreamSerializer(eConnect);
}
更新:
抱歉,这可能只是一个架构问题,但大约有 166 种可能的组合,为每个组合编写一个步骤似乎很荒谬。不过我可能不得不这样做......
对 eConnect 的 MS Doc 参考:http://msdn.microsoft.com/en-us/library/ff623781.aspx
调用序列化的示例代码:
IVItemMasterType o = new IVItemMasterType();
o.eConnectProcessInfo = null;
o.taCreateInternetAddresses_Items = null;
o.taCreateItemVendors_Items = null;
o.taCreateKitItemRcd_Items = null;
o.taItemSite_Items = null;
o.taIVCreateItemPriceListHeader = null;
o.taIVCreateItemPriceListLine_Items = null;
o.taRequesterTrxDisabler_Items = null;
o.taUpdateCreateItemCurrencyRcd_Items = null;
o.taUpdateCreateItemRcd = eConnectHelper.taUpdateCreateItemRcdFactory(eItem);
// Serialize into string & add to list
List<string> sList = new List<string>();
sList.Add(eConnectHelper.Serialize(o));
// Submit list to eConnect
eCreateEntity(sList);
SerializeMemoryStream 代码:
public static string MemoryStreamSerializer(eConnectType e)
{
XmlSerializer serializer = new XmlSerializer(e.GetType());
using (var memoryStream = new MemoryStream())
{
serializer.Serialize(memoryStream, e);
memoryStream.Position = 0;
// Use memory streamed XML document to create a string representation of the object
XmlDocument xmldoc = new XmlDocument();
xmldoc.Load(memoryStream);
memoryStream.Close();
string sDocument = xmldoc.OuterXml;
return sDocument;
}
}
更新 2:
非常感谢你们两位。在上面睡觉之后,我意识到我的架构中的错误。无论哪种方式我都必须构建 eConnect 对象,并且我已经在之前的方法调用中构建了子类型对象,所以我已经回溯并将类型化的序列化代码移动到主调用方法中。
我确实尝试了反射,虽然它确实编译并运行了,但由于某种原因,它除了 ObjectReference/NullReference,尽管据我所知,所有对象都被填充。
我是这样使用它的:
public static string Serialize<T>(T o)
{
eConnectType e = new eConnectType();
T[] myMaster = { o };
// Populate the eConnectType object with the schema object
typeof(eConnectType).GetProperty(typeof(T).Name).SetValue(e, myMaster, null);
return MemoryStreamSerializer(e);
}
【问题讨论】:
标签: c# generics serialization dynamics-gp