簡體   English   中英

如何使用Reflection獲取基礎構造函數調用參數

[英]How to get the base constructor calling parameters with Reflection

如何獲取子類構造函數用於調用基類構造函數的硬編碼參數?

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的子類的所有硬編碼格式字符串,即“Hello {0}”和“Hello {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拆卸工具,但是......又:大規模矯枉過正這里。

我會建議:

  • 只需查看在運行時BaseMessageformat
  • 使用編譯時工具(如分析器) - 或使用Roslyn解析源代碼 - 並在構建時獲取數據
  • 涉及屬性或屬性的東西; 從屬性或屬性中獲取值非常容易

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM