В настоящее время я генерирую код, чтобы я мог сделать эквивалент динамическим прокси (без затрат на отражение при вызове методов) следующим образом:
//This is not how I'd actually use it, but shows the code generation
public string GetSomethingWrapped(object target)
{
//Generate the code
string code = CreateCode(target.GetType());
CSharpCodeProvider provider = new CSharpCodeProvider();
//We want this to be in-memory only
CompilerParameters parameters = new CompilerParameters
{
GenerateExecutable = false,
GenerateInMemory = true,
OutputAssembly = Path.GetTempFileName()
};
//It needs to reference our running project's classes/namespaces
parameters.ReferencedAssemblies.Add(typeof(MyClass).Assembly.Location);
//Compile the code
CompilerResults results = provider.CompileAssemblyFromSource(
parameters,
code
);
//...elided...
IMyTestType instance = (IMyTestType) results.CompiledAssembly.CreateInstance(
NAMESPACE + "MyTestTypeImpl",
false,
BindingFlags.Instance | BindingFlags.Public,
(Binder)null,
new object[] { myBaseObject },
(CultureInfo)null,
(object[])null
);
//Now I can call methods directly on it
return instance.GetSomething();
}
Я провел небольшое исследование, и, похоже, это может не сработать в .Net Core 2.x, даже если я включу System.CodeDom
. Есть ли другой вариант?