假设您有两个简单的接口及其方法:
ISerializable.Serialize(IValueWriter writer)
IValueWriter.WriteInt32(Int32 value)
IValueWRiter.WriteInt64(Int64 value)
当一个类实现ISerializable
时,我希望能够知道对IValueWriter
实现中的ISerializable.Serialize(IValueWriter writer)
进行了哪些调用,并从中生成调用图。所有这些都需要在运行时使用反射和完成而不调用Serialize方法,并且它也将在我无法控制的类上完成,只要它们内部的代码可以进行。< / p>
示例:
public sealed class SomeObject : ISerializable
{
private readonly Int32 first;
private readonly Int64 second;
public SomeObject(Int32 first, Int64 second)
{
this.first = first;
this.second = second;
}
public void Serialize(IValueWriter writer)
{
writer.WriteInt32(this.first);
writer.WriteInt64(this.second);
}
}
调用图将是:
SomeObject -> Serialize | -> IValueWriter.WriteInt32
| -> IValueWriter.WriteInt64
如何以一种干净整洁的方式实现这一目标?
我真正的目标基本上是在接口方法的特定实现中进行的MethodInfo[]
调用。
答案 0 :(得分:0)
答案 1 :(得分:0)
是的,你可以使用反射来做到这一点。当所分析的代码都没有运行时,我不会把它称为“运行时”。
ISerializable
ISerializable.Serialize
callvirt
指令,其中方法令牌与IValueWriter
中的方法匹配。有一个开源项目ILSpy,它应该是如何解码IL指令并寻找方法调用的一个很好的例子。