"Downcast"一个对象到C#中的基类型

mar*_*c_s 5 c# type-conversion

我仍在研究我的通用日志记录组件,它应该处理任何类型的object并将其转换("序列化"它)为字符串.

到目前为止工作得很好 - 除了一个要求:我应该能够识别给定对象的基本类型(如果存在),并且还单独列出该基本类型的属性.

基本上,我有一个像这样的方法:

public string LogObject(object myObject)
Run Code Online (Sandbox Code Playgroud)

现在我想检查一下这个对象的类型是否有一个基类,如果有的话 - 获取我的对象的属性,"downcast"到它的基类型.

检查基类型并不难:

Type baseType = myObject.GetType().BaseType;
Run Code Online (Sandbox Code Playgroud)

但是我如何myObjectbaseType现在的类型对象转发?

我尝试了几件事,比如:

object baseObject = Convert.ChangeType(myObject, baseType);
Run Code Online (Sandbox Code Playgroud)

但是这需要我的对象类型来实现IConvertible我所有对象都无法满足的要求......

还有其他方法吗?

那些当然不起作用....

object baseObject = myObject as baseType;
object baseObject = (baseType)myObject;
Run Code Online (Sandbox Code Playgroud)

还有其他任何我想不到的方式吗?

更新:我已经考虑过这样做了

  • 抓住的所有属性myObject变成allProperties
  • 抓住那些在myObject类型上声明的属性declaredProperties(BindingFlag.Declared)
  • 得到baseProperties减去declaredPropertiesallProperties

但这似乎有点过分反映 - 不确定这是否会表现得体面......

Mor*_*ner 4

使用 BindingFlags.DeclaredOnly 获取仅在特定类型上声明的成员。此外,即使您不使用此标志,每个返回的 ProperyInfo 都有一个 DeclaredType 属性,其中列出了声明该属性的类型。

我能想到使用 DeclaredOnly 的唯一原因是如果您想要更好地控制结果集,例如过滤掉已在子类中重写的虚拟属性。

PS:使用像Fasterflect这样的库可以使这样的任务变得轻而易举;)