C# NET中的深度反思
我需要创建钻取对象属性的能力,例如两个或三个深度。例如,类A有一个对类B的属性引用,我需要访问类C。实现这一点的最佳方法是什么:直接反射,或者使用TypeDescriptor,或者其他什么C# NET中的深度反思,c#,.net,reflection,C#,.net,Reflection,我需要创建钻取对象属性的能力,例如两个或三个深度。例如,类A有一个对类B的属性引用,我需要访问类C。实现这一点的最佳方法是什么:直接反射,或者使用TypeDescriptor,或者其他什么 谢谢。写起来并不难。我将几个类放在一起处理这个问题,以便可以序列化WinForm的属性。看看这个类和相关的类 如果您知道静态上下文中的路径(即路径始终相同),并且可以访问属性(内部或公共),则可以使用动态 [Test] public void Foo() { var a
谢谢。写起来并不难。我将几个类放在一起处理这个问题,以便可以序列化WinForm的属性。看看这个类和相关的类
如果您知道静态上下文中的路径(即路径始终相同),并且可以访问属性(内部或公共),则可以使用动态
[Test]
public void Foo()
{
var a = new A
{
B = new B
{
C = new C
{
Name = "hello"
}
}
};
DoReflection(a);
}
private void DoReflection(dynamic value)
{
string message = value.B.C.Name;
Debug.WriteLine(message);
}
如果你想写自己的序列化代码,不管出于什么原因,你都会使用反射 您要做的是编写一个递归方法来序列化类型。然后,根据您认为合适的情况应用此方法以获得结果
var type = myObjectOfSomeType.GetType();
// now depending on what you want to store
// I'll save all public properties
var properties = type.GetProperties(); // get all public properties
foreach(var p in properties)
{
var value = p.GetValue(myObjectOfSomeType, null);
Writevalue(p.Name, value);
}
WriteValue
的实现必须识别内置类型并相应地处理它们,这是典型的字符串、字符、整数、双精度、日期时间等
- 如果遇到序列或集合,则需要写出许多值
- 如果它遇到一个非平凡类型,您将再次应用此递归模式
但是,我确实建议研究WCF,不是为了构建服务,而是为了序列化。它是.NET 3.0框架的一部分,带有一个新的assembly System.Runtime.serialization,通常在处理序列化和数据注释时非常有用。我们可以获得更多详细信息吗?任何类型的用法或示例代码?“我已经做了各种各样的反思,但我仍然不确定我是否理解你想做什么。”西蒙:是的,这是公开的@drachenstern我基本上是在尝试@Simon在他的文章中所做的事情。我正在创建一个序列化深层对象的过程,但以一种特殊的方式来满足特定的需要。我正在创建一个集中的过程,所以我需要能够在不知道属性是什么的情况下完成它。那是个好主意。