C # Reflection Emit Func с новым экземпляром - PullRequest
0 голосов
/ 26 декабря 2018

Я пытаюсь выдать следующий код через Reflection:

 this.Inputs = new DynamicCollection<IFunctionInput<Digital>>((string name) => new FunctionInput<Digital>(this, name));

Ctor DynamicCollection принимает функцию и выглядит так:

public DynamicCollection ( Func<string, T> createPin )

Но когда я смотрю наскомпилированный код IL дает мне:

IL_0008: ldarg.0
    IL_0009: ldarg.0
    IL_000a: ldftn instance class [CM.Shared]CM.Shared.IFunctionInput`1<valuetype [CM.Shared]CM.Shared.Digital> CM.Server.LogicalAndFunctionServer::'<.ctor>b__0_0'(string)
    IL_0010: newobj instance void class [mscorlib]System.Func`2<string, class [CM.Shared]CM.Shared.IFunctionInput`1<valuetype [CM.Shared]CM.Shared.Digital>>::.ctor(object,  native int)
    IL_0015: newobj instance void class CM.Server.DynamicCollection`1<class [CM.Shared]CM.Shared.IFunctionInput`1<valuetype [CM.Shared]CM.Shared.Digital>>::.ctor(class [mscorlib]System.Func`2<string, !0>)
    IL_001a: stfld class [CM.Shared]CM.Shared.IDynamicCollection`1<class [CM.Shared]CM.Shared.IFunctionInput`1<valuetype [CM.Shared]CM.Shared.Digital>> CM.Server.LogicalAndFunctionServer::'<Inputs>k__BackingField'
    IL_001f: ldarg.0

Но где в этом IL я могу найти экземпляр класса FunctionInput.Я могу видеть только некоторые IFunctionInput-типы, которые являются интерфейсом, реализованным FunctionInput, но как этот код знает, какой реальный тип может быть создан?У кого-нибудь есть идея?

1 Ответ

0 голосов
/ 26 декабря 2018

Хорошо, я решил это сам.Не думал о том, что лямбда захватывает «это», поэтому создает для него класс замыкания."Просто декомпилировать" Telerik не показывает Closure-классы, но я видел это в ildasm.

...