Monday, 15 September 2014

c# - Code Emit and Expressions -



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