同事遇到一个问题:在做手机app接口时,返回JSON格式,json里面的数据属性均是string类型,但不能出现NULL(手机端那边说处理很麻烦,哎)。Model已经创建好了,而且model的每个属性均是string类型。数据层使用EF。数据库也有些字段可为空。这时,需要大量的验证属性是否为NULL,并将属性值为NULL的转换成"".

解决方案:1遍历model各个属性,当为NULL时,赋值"".2.支持泛型List<model>的嵌套。

前提条件:model的值只有这几种,List<model> ,string ,多层嵌套。

于是写了如下代码遍历属性,遇到很多问题,初稿,临时用,后面完善。


        /// <summary>
/// 去除model属性为null 的情况,把null改成""。。该方法仅用在属性均为string类型的情况,主要用于手机APP。 chj 2015-5-7 17:39:21
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="inputModel"></param>
/// <returns></returns>
public static object CJRemoveNULLByRecursive(object obj)
{
Type t = obj.GetType();
var typeArr = t.GetProperties();
object tempItem;//应对属性含有参数时。
if (obj != null )
{
foreach (var pi in typeArr)
{
//当属性为字符串时
if (pi.PropertyType == typeof(string))
{
if (pi.GetValue(obj, null)==null)
{
pi.SetValue(obj, "", null);
}
}
//当该属性为List泛型时,或者为引用类型,数组时。这里好像有个属性可以直接判断
else if(pi.PropertyType.IsGenericType||pi.PropertyType.IsArray||pi.PropertyType.IsClass)//.GetType()=typeof(Nullable))
{
var paras= pi.GetIndexParameters(); //索引化属性的参数列表
if (paras.Count()> 0)
{
int i = 0;
tempItem = pi.GetValue(obj, new object[] { 0 });
while (tempItem!=null)
{
pi.SetValue(obj, CJRemoveNULLByRecursive(tempItem), new object[] { i });
i++;
try
{
tempItem = pi.GetValue(obj, new object[] { i });
}
catch (Exception)
{
break;
}
}
}
else
{
pi.SetValue(obj, CJRemoveNULLByRecursive(pi.GetValue(obj, null)), null);
}
} }
}
else
{
return "";
} return obj;
}

  由于可能嵌套多层,使用递归。

   临时方案,留在这,后面不定期完善中。。。

C#遍历Object各个属性含List泛型嵌套。的更多相关文章

  1. javascript 遍历object对象

    (function(){ var str = ''; for(var i in obj){ //遍历object str += '\n'+(i+' : '+obj[i]); // i+' : '+ob ...

  2. 面向对象中Object常用属性总结

    学完Object属性,自己总结一些常用是Object常用属性. Object.prototype:属性表示Object的原型对象. 属性: Object.prototype.constructor:特 ...

  3. js遍历Object所有属性

    在js中经常需要知道Object中的所有属性及值,然而若是直接弹出Object,则是直接显示一个对象,它的属性和值没有显示出来, 不是我们想要的结果,从而需要遍历Object的所有属性. var ob ...

  4. JS遍历对象的属性和值

    对于需要动态获取对象的某些属性和对应的值的时候,就需要遍历对象的属性和值. const user = { name: '张三', age: 20, addr: '湖北武汉', sex: '男' } / ...

  5. js object 对象 属性和方法的使用

    //object 对象 属性和方法的使用 var person = new Object(); person.name="张海"; person.age="; perso ...

  6. js动态参数作为Object的属性取值

    js动态参数作为Object的属性取值var myObj = {"a":1,"b":2};var a = 'a';myObj[a] 就可以获取到 属性a的值了

  7. for/in 循环遍历对象的属性

    for/in 语句循环遍历对象的属性. js中获取key得到某对象中相对应的value的方法:obj.key js中根据动态key得到某对象中相对应的value的方法有二: 一.var key = & ...

  8. JS如何遍历Object中的所有属性?

    JS如何遍历Object中的所有属性? var params = ""; for(var i in baseParams){ params += "&" ...

  9. Java中HashMap(泛型嵌套)的遍历

    //Studnet package yzhou.gen03; public class Student<T> { private T score; public T getScore() ...

随机推荐

  1. EF中的自动追踪与代理

    自动追踪 EF框架会自动追踪实体的变化(通过比较实体的当前值与原始值). 默认情况下,以下方法会自动触发实体变化的追踪 DbSet.Find DbSet.Local DbSet.Remove DbSe ...

  2. (转)ip地址,手机ip查询

    页面地址:http://www.ip138.com/ 外链地址(实际主页面里面有)http://www.ip138.com/iplink.htm 外链地址里面的内容: <FORM METHOD= ...

  3. 掌众android面试题

    1,android动画分类? http://www.cnblogs.com/angeldevil/archive/2011/12/02/2271096.html 2,android service启动 ...

  4. 网站压缩数据 GZIP

    //1.被压缩数据 String str="Hello 你好Hello 你好Hello 你好Hello 你好Hello 你好Hello 你好Hello 你好Hello 你好Hello 你好H ...

  5. PHP页面中文乱码问题

    首先纯html页要用meta标签声明编码<meta http-equiv="Content-Type" content="text/html; charset=&q ...

  6. ATM Solved Problem code: HS08TES

    # ATM import sys withdraw, balance = map(float, sys.stdin.readline().strip().split()) # strip()用法去除结 ...

  7. 如果通过adb查看当前显示的activity

    通过adb 查看最上层成activity名字: linux: adb shell dumpsys activity | grep "mFocusedActivity" window ...

  8. ARM的两种启动方式 (NAND FLASH. NOR FLASH)

    为什么会有两种启动方式? 这就是有两种FLASH 的不同特点决定的. NAND FLASH 容量大,存储的单位比特数据的成本要低很多,但是要按照特定的时序对NAND  FLASH  进行读写,因此CP ...

  9. HTML5实现的视频播放器01

    HTML5实现的视频播放器   什么是hivideo? 最近一段时间在使用PhoneGap开发一个App应用,App需要播放视频,本想直接使用html5的video,但使用它在全屏播放时不支持横屏播放 ...

  10. delegate,notifucation,KVO三种模式实现通信的优缺点

             在开发ios应用的时候,我们会经常遇到一个常见的问题:在不过分耦合的前提下,controllers间怎么进行通信.在IOS应用不断的出现三种模式来实现这种通信: 1.委托delega ...