利用反射拿到并递归C#类中的各个字段名字及类型

摘要:
以下方法实现了遍历一个class中所有的字段,并且递归遍历subclass。
以下方法实现了遍历一个class中所有的字段, 并且递归遍历sub class。
privateStringBuilder_properties=newStringBuilder();
publicMainView()
{
TraversalProperties(typeof(StudyInfoModel));
File.WriteAllText("Properties.txt",_properties.ToString());
}
privatevoidTraversalProperties(TypeclassTemplate)
{
if(null==classTemplate)
{
return;
}
foreach(PropertyInfopiin
classTemplate.GetProperties(BindingFlags.Public|BindingFlags.Instance|BindingFlags.DeclaredOnly))
{
PropertyInfoneedUpdateValue=classTemplate.GetProperty(pi.Name);
if(needUpdateValue.PropertyType.Equals(classTemplate))
{
return;
}
if(needUpdateValue.PropertyType.IsArray
|| (needUpdateValue.PropertyType.IsClass
&& !needUpdateValue.PropertyType.IsGenericType
&& !needUpdateValue.PropertyType.Equals(typeof(String))
&& !needUpdateValue.PropertyType.IsValueType
)
)
{
TraversalProperties(needUpdateValue.PropertyType);
}
elseif(needUpdateValue.PropertyType.IsGenericType
&&needUpdateValue.PropertyType.GetGenericTypeDefinition()==typeof(ObservableCollection<>))
{
TraversalProperties(needUpdateValue.PropertyType.GetGenericArguments()[0]);
}
else
{
if(classTemplate.Name.Contains("StudyInfoModel"))
{
_properties.AppendFormat(""{0}", ",needUpdateValue.Name);
}
else
{
_properties.AppendFormat(""{0}_{1}", ",classTemplate.Name.Replace("InfoModel",""),needUpdateValue.Name);
}
}
}
}

免责声明:文章转载自《利用反射拿到并递归C#类中的各个字段名字及类型》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇vue常用插件-数字滚动效果vue-count-to工具-效率工具-XMIND8破解(99.1.3)下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

尾递归优化

尾递归优化是利用上面的第一个特点“调用同一个方法”来进行优化的 尾递归优化其实包括两个东西:1)尾递归的形式;2)编译器对尾递归的优化 尾递归的形式 尾递归其实只是一种对递归的特殊写法,这种写法原本并不会带来跟递归不一样的影响,它只是写法不一样而已,写成这样不会有任何优化效果,该爆的栈和帧都还会爆 具体不一样在哪里 前面说了,递归的本质是某个方法调用了自身...

无废话JavaScript(下)

无废话JavaScript(下)上一篇在这里,在这里,在这里……五、函数式这个可不是JavaScript的发明,它的发明人已经死了,而他的这个发明还在困扰着我们……如同爱迪生的灯泡还在照耀着我们。其实函数式语言很简单,它就是一种与命令式语言同样“完备”的语言实现方案。由于它的基础思想与命令式——如果你不想用这个难于理解的名词,那就把它换成C,或者Delph...

Sqlite-Sqlite3中的数据类型

大多数的数据库引擎(到现在据我们所知的除了sqlite的每个sql数据库引擎)都使用静态的、刚性的类型,使用静态类型,数据的类型就由它的容器决定,这个容器是这个指被存放的特定列。 Sqlite使用一个更一般的动态类型系统,sqlite中,值的数据类型跟值本身相关,而不是与它的容器相关。Sqlite的动态类型系统和其他数据库的更为一般的静态类型系统相兼容,但...

3.4.4 利用栈将递归转换成非递归的方法

在函数执行时系统需要设立一个“递归工作栈”存储第一层递归所需的信息,此工作栈是递归函数执行的辅助空间,所以可以看出,递归程序在执行时需要系统提供隐式栈这种数据结构来实现,对于一般的递归过程,仿照递归算法执行过程中递归工作栈的状态变化可直接写出相应的非递归算法。这种利用栈消除递归过程的步骤如下。 (1)设置一个工作栈存放递归工作记录(包括实参、返回地址及局部...

LinqHelper拓展

public static class LinqHelper { //NHibernate.Hql.Ast.HqlBooleanExpression public static Expression<Func<T, bool>> True<T>() {...

golang学习笔记---reflect包

go语言提供了一种机制,在编译时不知道类型的情况下,可更新变量,在运行时查看值,调用方法以及直接对他们的布局进行操作。这种机制称为反射(reflection)。 为什么使用反射 有时候我们需要写一个函数有能力统一处理各种值类型的函数,而这些类型可能无法共享同一个接口,也可能布局未知,也有可能这个类型在我们设计函数时还不存在。甚至这个类会同时存在上面三个问...