查了下,没有找到现成的,如果有的话请告知,或者对于这个问题有更好的解决方法,也不吝赐教。
目前我想到的方法是,给对象增加一个特性,然后标记其不为空;
然后在反序列化后用反射的方法,读取这个特性,如果存在并判断是不是值为空。
代码如下,我遇到了一个问题,就是当属性是类,或者集合的时候,如何处理,不会了,求助
public class TestXML { public string Fir { get; set; } public string Sec { get; set; } [XmlElement("")] public List<TestXML2> TestXML1 { get; set; } } public class TestXML2 { public string Thir { get; set; } public TestXML3 TestXML3 { get; set; } } public class TestXML3 { [NotNull] public string For { get; set; } } public class NotNullAttribute : Attribute { }
public static T XmlToModelS<T>(string xml) { StringReader xmlReader = new StringReader(xml); XmlSerializer xmlSer = new XmlSerializer(typeof(T)); T t = (T)xmlSer.Deserialize(xmlReader); Type typeT = typeof(T); IfIsClass<T>(typeT, t); return t; } private static void IfIsClass<T>(Type typeT, T t) { foreach (PropertyInfo p in typeT.GetProperties()) { ///如果属性P是类,或者集合类 ///IfIsClass<p.Name>(p的类型,p的实例) if (p.PropertyType == typeof(System.String)) Console.WriteLine("111");//这里可行,那么如何判断他是类或者List集合,并且拆掉集合??? IfIsNull<T>(p, t); } } private static void IfIsNull<T>(PropertyInfo p, T t) { var at = p.GetCustomAttribute(typeof(NotNullAttribute)); var pvalue = p.GetValue(t); if (at != null && string.IsNullOrEmpty(pvalue == null ? "" : pvalue.ToString())) { throw new Exception(string.Format("{0}不能为空", p.Name)); } }
string strin = "<TestXML><Fir>f</Fir><TestXML1><TestXML3><For></For></TestXML3></TestXML1></TestXML>"; TestXML ttt1 = Serializer.XmlToModelS<TestXML>(strin);
public static T XmlToModel<T>(string xml)
{
StringReader xmlReader = new StringReader(xml);
XmlSerializer xmlSer = new XmlSerializer(typeof(T));
T t = (T)xmlSer.Deserialize(xmlReader);
Type typeT = typeof(T);
IfIsClass(t);
return t;
}
private static void IfIsClass(object t)
{
var typeT = t.GetType();
foreach (PropertyInfo p in typeT.GetProperties())
{
if (typeof(System.Collections.ICollection).IsAssignableFrom(p.PropertyType))
{
var vValue = p.GetValue(t, null) as System.Collections.ICollection;
foreach(var item in vValue )
{
IfIsClass(item);
}
}
else
{
IfIsNull(p, p.GetValue(t, null));
}
}
}
private static void IfIsNull(PropertyInfo p, object pvalue)
{
var at = p.GetCustomAttribute(typeof(NotNullAttribute));
if (at != null && string.IsNullOrEmpty(pvalue == null ? "" : pvalue.ToString()))
{
throw new Exception(string.Format("字段[{0}]不能为空", p.Name));
}
}
你传递集合过去 看p.PropertyType是什么
p.PropertyType就是类的属性,问题是如何确定他是集合,或者下级类