总的来说,我同意其他人的评论。我使用过Castle的DynamicProxy,我认为它非常棒。你可以用它做一些非常惊人和强大的事情。话虽如此,如果你仍在考虑编写自己的代码,请继续阅读:
如果你对发射IL不感兴趣,那么有一些使用Lambda表达式的新技术可以用来生成代码。然而,这并不是一个简单的任务。
以下是我如何使用Lambda表达式为任何.NET事件生成动态事件处理程序的示例。你可以使用类似的技术来生成动态接口实现。
public delegate void CustomEventHandler(object sender, EventArgs e, string eventName);
Delegate CreateEventHandler(EventInfo evt, CustomEventHandler d)
{
var handlerType = evt.EventHandlerType;
var eventParams = handlerType.GetMethod("Invoke").GetParameters();
var parameters = eventParams.Select((p, i) => Expression.Parameter(p.ParameterType, "x" + i)).ToArray();
MethodInfo targetMethod = d.GetType().GetMethod(
"Invoke",
new Type[] { typeof(object), typeof(EventArgs), typeof(string) }
);
var p1 = Expression.Convert(parameters[0], typeof(object));
var p2 = Expression.Convert(parameters[1], typeof(EventArgs));
var p3 = Expression.Constant(evt.Name);
var body = Expression.Call(
Expression.Constant(d),
targetMethod,
p1,
p2,
p3
);
var lambda = Expression.Lambda(body, parameters.ToArray());
return Delegate.CreateDelegate(handlerType, lambda.Compile(), "Invoke", false);
}
问候,
-道格