我正在尝试(1)记录对象的所有属性,以及(2)内特定对象类型的所有属性。我可以做(1)但不能做(2)。
现在就是这种情况。
foreach (PropertyDescriptor descriptor in TypeDescriptor.GetProperties(object1))
{
string name = descriptor.Name;
object value = descriptor.GetValue(object1);
logger.Debug(String.Format("{0} = {1}", name, value));
}
我需要的是这样的:
foreach (PropertyDescriptor descriptor in TypeDescriptor.GetProperties(object1))
{
string name = descriptor.Name;
object value = descriptor.GetValue(object1);
logger.Debug(String.Format("{0} = {1}", name, value));
// TODO check if the current property of object1 is of type object2, how?
if (...) {
// TODO repeat the process for object2
foreach (PropertyDescriptor innerdescriptor in TypeDescriptor.GetProperties(object2))
{
string innername = innerdescriptor.Name;
object innervalue = innerdescriptor.GetValue(object2);
logger.Debug(String.Format(" {0} = {1}", innername, innervalue));
}
} // end if
}
但是,无论我尝试什么,这第二件事都不起作用。所以,请帮忙。
更新我对支票有一个答案(@Alex Art。)
if (descriptor.PropertyType == typeof(the type that you expecting) ) { ... }
现在唯一剩下的就是内部对象属性记录器!
我认为可以通过反射来实现(但是您应该意识到性能下降):
public void LogProps(Object object1)
{
var objType = object1.GetType();
IList<PropertyInfo> properties = new List<PropertyInfo>(objType.GetProperties());
foreach (PropertyInfo prop in properties)
{
var propValue = prop.GetValue(object1, null);
if(prop.PropertyType == typeof(yourTypeHere))
{
LogProps(propValue);
}
else
{
logger.Debug(String.Format("{0} = {1}", prop.Name, propValue));
}
}
}
我在这里也使用了递归,如果您的层次结构比较长,也可能会出现问题
关于您的解决方案:
// TODO检查object1的当前属性是否为object2类型,如何?
您是否尝试使用PropertyDescriptor.PropertyType吗?:
object value = descriptor.GetValue(object1);
if (descriptor.PropertyType == typeof(the type that you expecting) )
{
foreach (PropertyDescriptor innerdescriptor in TypeDescriptor.GetProperties(value)
{
string innername = innerdescriptor.Name;
object innervalue = innerdescriptor.GetValue(object2);
logger.Debug(String.Format(" {0} = {1}", innername, innervalue));
}
} // end if
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句