1
A
回答
0
亞音速論壇上有此線程,一個可能的解決方案:
http://forums.subsonicproject.com/forums/t/334.aspx
#region Overridden XML Serialization Logic
public override object NewFromXML(string xml)
{
System.Xml.XmlDocument xdoc = new System.Xml.XmlDocument();
xdoc.LoadXml(xml);
object lObject = base.NewFromXML(xml);
PropertyInfo[] propertyInfos = lObject.GetType().GetProperties();
foreach (PropertyInfo propertyInfo in propertyInfos)
{
if (propertyInfo == null)
continue;
if (propertyInfo.PropertyType.IsGenericType && propertyInfo.PropertyType.GetGenericTypeDefinition() == typeof(Nullable<>))
{
if (xdoc.DocumentElement.Attributes[propertyInfo.Name] == null)
continue;
string textValue = xdoc.DocumentElement.Attributes[propertyInfo.Name].Value;
Type[] typeArgs = propertyInfo.PropertyType.GetGenericArguments();
if (typeArgs == null || typeArgs.Length == 0)
continue;
object typedValue = GetTypedValue(textValue, typeArgs[0]);
propertyInfo.SetValue(lObject, typedValue, null);
}
}
return lObject;
}
private object GetTypedValue(string textValue, Type type)
{
if (string.IsNullOrEmpty(textValue))
return null;
object typedValue = null;
if (type == typeof(DateTime))
typedValue = Convert.ToDateTime(textValue);
else if (type == typeof(Byte))
typedValue = Convert.ToByte(textValue);
else if (type == typeof(Int16))
typedValue = Convert.ToInt16(textValue);
else if (type == typeof(Int32))
typedValue = Convert.ToInt32(textValue);
else if (type == typeof(Int64))
typedValue = Convert.ToUInt64(textValue);
else if (type == typeof(Double))
typedValue = Convert.ToDouble(textValue);
else if (type == typeof(Single))
typedValue = Convert.ToSingle(textValue);
else if (type == typeof(Boolean))
typedValue = Convert.ToBoolean(textValue);
else if (type == typeof(Guid))
typedValue = new Guid(textValue);
else
throw new NotImplementedException(string.Format("Conversion of type {0} from a string to a typed value is not implemented, yet. TextValue: {1}", type, textValue));
return typedValue;
}
public override string ToXML()
{
string xml = base.ToXML();
System.Xml.XmlDocument xdoc = new System.Xml.XmlDocument();
xdoc.LoadXml(xml);
PropertyInfo[] propertyInfos = this.GetType().GetProperties();
foreach (PropertyInfo propertyInfo in propertyInfos)
{
if (propertyInfo.PropertyType.IsGenericType && propertyInfo.PropertyType.GetGenericTypeDefinition() == typeof(Nullable<>))
{
object val = propertyInfo.GetValue(this, null);
if (val == null)
continue;
XmlAttribute attribute = xdoc.CreateAttribute(propertyInfo.Name);
attribute.Value = val.ToString();
xdoc.DocumentElement.Attributes.Append(attribute);
Console.WriteLine(propertyInfo.Name);
}
}
return xdoc.DocumentElement.OuterXml;
}
#endregion
相關問題
- 1. 亞音速2.2
- 2. 列亞音速2.2
- 3. 亞音速2.2/2.1的bug
- 4. 亞音速2.2源代碼
- 5. 實現IDataErrorInfo的亞音速2.2
- 6. 幫助亞音速2.2結合
- 7. 鑄造爲varchar使用亞音速2.2
- 8. 亞音速2.2和ASP.NET的GridView
- 9. 問題關於亞音速2.2版
- 10. 異常亞音速2.2,SQLite和遷移
- 11. 亞音速2.2 LEFT JOIN錯誤
- 12. 亞音速自定義集合類型
- 13. 亞音速2.2 SqlQuery類與內部連接和在哪裏
- 14. 亞音速3
- 15. 亞音速
- 16. 亞音速2.2:更新僅適用於某些字段?
- 17. 亞音速2.2不能解決如何做我的加入
- 18. 亞音速2.2內連接兩個數據庫
- 19. 簡單查詢使用亞音速2.2與Oracle.dataclient錯誤
- 20. 批量插入到不同的供應商亞音速2.2
- 21. 無法插入使用記錄(SqlServer的)亞音速2.2
- 22. 亞音速2.2 VARCHAR2最大長度問題
- 23. 亞音速3 - SimpleRepository
- 24. 亞音速與webservice
- 25. 亞音速版本
- 26. 亞音速.Filter()在
- 27. 亞音速2.1:SqlQuery.ExecuteJoinedDataSet()
- 28. 亞音速收集
- 29. SQLite和亞音速
- 30. 只生成修改表類 - 亞音速