在使用.net的ORM时用到了EF来操作数据库,使用的是基于DB的CodeFirst模式,其自动根据数据库中的每个表生成了相应的类,但生成的类中并没有定义toString方法。且对于表中的外键主键约束该类中还多了许多visual的属性。
需求是用一种通用的方法来方便的在控制台输出其不包含visual的属性值。
代码
/// <summary>
/// 利用反射遍历输出一个对象中所有的属性和值,且排除含visual关键字的属性
/// </summary>
/// <param name="obj"></param>
public static void PrintProperties(Object obj)
{
Type type = obj.GetType();
foreach (PropertyInfo p in type.GetProperties())
{
//如果要输出所有属性,将if语句块删去即可
if (p.GetMethod.IsVirtual == true)
{
continue;
}
Console.Write(p.Name+":");
Console.WriteLine(p.GetValue(obj));
}
}
/// <summary>
/// 简单的将对象的所有属性转化为json,且排除含visual关键字的属性
/// </summary>
/// <param name="obj"></param>
public static string ToStringProperties(Object obj)
{
StringBuilder jsonString = new StringBuilder();
jsonString.Append("{");
Type type = obj.GetType();
foreach (PropertyInfo p in type.GetProperties())
{
//排除含visual关键字的属性
if (p.GetMethod.IsVirtual == true)
{
continue;
}
jsonString.Append(p.Name);//将属性名称赋值给字符串
jsonString.Append(":");
jsonString.Append(p.GetValue(obj,null));
jsonString.Append(",");
}
jsonString.Remove(jsonString.Length - 1, 1);
jsonString.Append("}");
return jsonString.ToString();
}
排除visual的属性用到了以下方法:
var isVirtual = typeof(TestClass).GetMethod("Message").IsVirtual;
使用C#输出对象所有属性
//c#遍历一个对象中所有的属性和值
public static void PrintProperties(Object obj)
{
Type type = obj.GetType();
foreach (PropertyInfo p in type.GetProperties())
{
Console.WriteLine(p.GetValue(obj));
}
}