在 C# 中记录对象的所有属性.如何记录内部对象属性
本文关键字:属性 记录 何记录 内部对象 对象 | 更新日期: 2023-09-27 18:33:17
我正在尝试(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艺术)
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 检查对象 1 的当前属性是否为对象 2 类型, 如何?
您是否尝试过使用 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
如果这是为了在运行时记录对象的状态,您可能会发现将整个对象序列化为 JSON 并将其存储起来更容易。 这还有一个额外的好处,即与自定义解决方案相比,人类可读且更灵活。
若要忽略某些属性,请对它们应用 IgnoreDataMemberAttribute。
即
[DataContract]
public class MyObjectParent
{
[DataMember]
public int ImportantValue { get; set; }
[DataMember]
public MyObjectChild Child { get; set; }
[IgnoreDataMember]
public AnotherClassThatIWantToIgnore IgnoreMe { get; set; }
}
[DataContract]
public class MyObjectChild
{
[DataMember]
public string ImportantValue { get; set; }
}
public string ObjectAsJson<T>(T obj) where T : class
{
var serializer = new DataContractJsonSerializer(typeof(T));
using (var stream = new MemoryStream())
{
serializer.WriteObject(stream, obj);
return Encoding.Default.GetString(stream.ToArray());
}
}