我甚至不确定如何描述我尝试做的事情(抱歉,新手),但重复代码因为我还没弄清楚如何正确行事并非如此在我的名单上。有什么帮助吗?
原始的非通用方法:
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种可能的组合,为每一个编码这一步似乎很荒谬。我可能不得不这样做......
MS Doc对eConnect的引用: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对象,并且我已经在之前的方法调用中构建了子类型对象,因此我已经回溯并将键入的序列化代码移动到主调用方法中。 / p>
我确实尝试过反射,虽然它确实编译并运行,但出于某种原因它除了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);
}
答案 0 :(得分:1)
这里的问题是泛型类型参数无法控制属性名称。 eConnect
具有名为IViewMasterType
的属性的事实就泛型类型系统而言完全是巧合。
您可以eConnectType<T>
使用属性public T[] SomePropertyName { get; set; }
。换句话说,键入的属性名称不能与其类型相关。然后你会这样做:
public static string Serialize<T>(T o)
{
eConnectType<T> eConnect = new eConnectType<T>();
T[] myMaster = { o };
// Populate the eConnectType object with the schema object
eConnect.SomePropertyName = myMaster;
return MemoryStreamSerializer(eConnect);
}
但是如果没有看到更多的代码,很难说这是否会有所帮助。
修改
根据你的更新,我会倾向于弗朗西斯建议使用反射。反思速度较慢,但根据我的经验,它实际上从未如此缓慢,以至于我实际需要进行优化。
答案 1 :(得分:1)
如果您确实需要访问具有相同通用类型名称的属性,则必须使用Reflection
typeof(eConnectType).GetProperty(typeof(T).Name).SetValue(eConnect, myMaster, null);
答案 2 :(得分:1)
经过一些仔细的调试后,这个“getProperties”继续返回“null”引用,因为这个eConnecType类中的成员是“Fields”而不是属性......这是修复...
public static string Serialize<T>(T o)
{
eConnectType e = new eConnectType();
T[] myMaster = { o };
// Populate the eConnectType object with the schema object
typeof(eConnectType).GetField(typeof(T).Name).SetValue(e, myMaster);
return MemoryStreamSerializer(e);
}