首页 新闻 会员 周边

如何在XML反序列化时不允许某个字段为空

0
悬赏园豆:20 [已解决问题] 解决于 2016-05-20 17:22

查了下,没有找到现成的,如果有的话请告知,或者对于这个问题有更好的解决方法,也不吝赐教。


目前我想到的方法是,给对象增加一个特性,然后标记其不为空;
然后在反序列化后用反射的方法,读取这个特性,如果存在并判断是不是值为空。

代码如下,我遇到了一个问题,就是当属性是类,或者集合的时候,如何处理,不会了,求助


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);
Main方法调用
plcly的主页 plcly | 菜鸟二级 | 园豆:206
提问于:2016-05-18 16:26
< >
分享
最佳答案
0

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));
}
}

plcly | 菜鸟二级 |园豆:206 | 2016-05-19 13:48
其他回答(1)
0

你传递集合过去 看p.PropertyType是什么

收获园豆:20
大杯美式不加糖不加奶 | 园豆:994 (小虾三级) | 2016-05-19 09:11

p.PropertyType就是类的属性,问题是如何确定他是集合,或者下级类

支持(0) 反对(0) plcly | 园豆:206 (菜鸟二级) | 2016-05-19 09:54
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册