質問: () => x; ```
回答: 質問の状況であれば逆コンパイルによって`Func`から変数名を読み取ることは可能です。 考え方としては 1. `Delegate`インスタンスの`Method`プロパティから`MethodInfo`を取得する 2. `MethodInfo`から`GetMethodBody().GetILAsByteArray()`でILコードを取得する 3. IL中の`ldfld`(`0x7B`)がフィールドから値を読みだしている箇所で、続く4バイト(リトルエンディアン)が`FieldInfo.MetadataToken`に該当する 4. フィールドの定義されている`ModuleHandle`は`Delegate.Target`→`Object.GetType()`→`Type.TypeHandle`→`RuntimeTypeHandle.GetModuleHandle()`で取得できる 5. `ModuleHandle.ResolveFieldHandle(int)`でメタデータトークンからハンドルが取得できる 6. `FieldInfo.GetFieldFromHandle()`で`FieldInfo`が取得できる のようになります。 ``` static class Program { static void Main(string[] args) { var a = typeof(Program).GetHashCode(); var b = typeof(Program).GetType().GetHashCode(); WriteFieldName(() => a); WriteFieldName(() => b); Console.ReadKey(); } private static void WriteFieldName(Func a) { var body = a.Method.GetMethodBody().GetILAsByteArray(); var ldfldPos = Array.LastIndexOf(body, (byte)0x7B); var metadataToken = (body[ldfldPos + 4] << 24) + (body[ldfldPos + 3] << 16) + (body[ldfldPos + 2] << 8) + body[ldfldPos + 1]; Console.WriteLine(FieldInfo.GetFieldFromHandle(a.Target.GetType().TypeHandle.GetModuleHandle().ResolveFieldHandle(metadataToken)).Name); } } ```