gpt4 book ai didi

c# - 如何使用反射获取基础构造函数调用参数

转载 作者:太空狗 更新时间:2023-10-30 01:00:13 24 4
gpt4 key购买 nike

如何获取子类构造函数调用基类构造函数的硬编码参数?

public class BaseMessage
{
public BaseMessage(string format, params string[] parameteres)
{
}
}

public class HelloMessage : BaseMessage
{
public HelloMessage(string name) : base("Hello {0}", name)
{
}
}

public class IntroductionMessage : BaseMessage
{
public IntroductionMessage(string name, string myName) : base("Hello {0}, I am {1}", name, myName)
{
}
}

我想获取 BaseMessage 子类的所有硬编码格式字符串,即“你好{0}”和“你好{0},我是{1}”

最佳答案

在反射层,唯一存在的地方是构造函数的方法主体,它被编译为 (HelloMessage):

.method public hidebysig specialname rtspecialname instance void
.ctor(string name) cil managed
{
.maxstack 8
L_0000: ldarg.0
L_0001: ldstr "Hello {0}"
L_0006: ldc.i4.1
L_0007: newarr string
L_000c: dup
L_000d: ldc.i4.0
L_000e: ldarg.1
L_000f: stelem.ref
L_0010: call instance void BaseMessage::.ctor(string, string[])
L_0015: ret
}

或(IntroductionMessage):

.method public hidebysig specialname rtspecialname instance void
.ctor(string name, string myName) cil managed
{
.maxstack 8
L_0000: ldarg.0
L_0001: ldstr "Hello {0}, I am {1}"
L_0006: ldc.i4.2
L_0007: newarr string
L_000c: dup
L_000d: ldc.i4.0
L_000e: ldarg.1
L_000f: stelem.ref
L_0010: dup
L_0011: ldc.i4.1
L_0012: ldarg.2
L_0013: stelem.ref
L_0014: call instance void BaseMessage::.ctor(string, string[])
L_0019: ret
}

所以; 通过反射,您必须获取方法主体 (MethodInfo.GetMethodBody().GetILAsByteArray()) 并手动解构它(注意您'将有编译的 IL 来处理,而不是我展示的文本版本)。这是可能的,但对于您可能想要的东西来说过于复杂了。有 运行时 IL 反汇编工具,但是......再次强调:这里的杀伤力太大了​​。

我会推荐:

  • 只需查看在运行时 BaseMessage 中以 format 到达的值
  • 使用分析器等编译时工具 - 或者使用 Roslyn 解析源代码 - 并在构建时获取数据
  • 涉及属性或性质的东西;从属性或特性中获取值非常容易

关于c# - 如何使用反射获取基础构造函数调用参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48298030/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com