c# - Code Emit and Expressions -
i using code emit dynamic code generation. set field using external mill method. here (reduced) code:
defines:
func<object> fact = () => new b(); var mi = fact.getmethodinfo(); var t = typeof(b); emit code:
ilgenerator ilg; var tb = _mb.definetype("myproxy", typeattributes.public | typeattributes.class, typeof(object)); var fieldbuilder = tb.definefield("proxy", t, fieldattributes.private); var ctorbuilder = tb.defineconstructor(...); ilg = ctorbuilder.getilgenerator(); ilg.emit(opcodes.ldarg_0); ilg.emit(opcodes.call, typeof(object).getconstructor(type.emptytypes)); ilg.emit(opcodes.ldarg_0); ilg.emit(opcodes.callvirt, mi); ilg.emit(opcodes.castclass, t); ilg.emit(opcodes.stfld, fieldbuilder); ilg.emit(opcodes.ret); create instace:
activator.createinstance(tb.createtype()); targetinvocationexception thrown
{"method not found: \"?\"."}
here looking forwards generate:
public class { private b _proxy; public a(func<object> factory) { _proxy = (b)factory(); } } but mill method fixed , not provided parameter...
public class { private b _proxy; public a() { _proxy = (b) //[generate me] () => new b(); } } any suggestions?
you have invoke delegate via "invoke" method need give mill delegate proxy. can add together parameter proxy constructor.
public class b { } static internal class metadata<t> //avoid lock & string metadata description { static public readonly type type = typeof(t); static public fieldinfo field<x>(expression<func<t, x>> expression) { homecoming (expression.body memberexpression).member fieldinfo; } static public propertyinfo property<x>(expression<func<t, x>> expression) { homecoming (expression.body memberexpression).member propertyinfo; } static public methodinfo method(expression<action<t>> expression) { homecoming (expression.body methodcallexpression).method; } static public methodinfo method<x>(expression<func<t, x>> expression) { homecoming (expression.body methodcallexpression).method; } } class programme { static void main(string[] args) { var _factory = new func<object>(() => new b()); typebuilder _typebuilder = null;// = ...; var _parameters = new type[] { metadata<func<object>>.type }; var _constructor = _typebuilder.defineconstructor(methodattributes.public, callingconventions.hasthis, _parameters); var _body = _constructor.getilgenerator(); //... _body.emit(opcodes.ldarg_1); _body.emit(opcodes.call, metadata<func<object>>.method(_func => _func.invoke())); //... var _type = _typebuilder.createtype(); var _parameter = expression.parameter(metadata<func<object>>.type); var _new = expression.lambda<func<func<object>, object>>(expression.new(_type.getconstructor(_parameters), _parameter), _parameter).compile(); var _instance = _new(_factory); } } c# lambda
No comments:
Post a Comment