public DynamicMixinTypeGenerator(ModuleScope scope, Type targetType, IEnumerable <MethodInfo> methodsToOverride, MethodInvocationHandler invocationHandler) { ArgumentUtility.CheckNotNull("scope", scope); ArgumentUtility.CheckNotNull("targetType", targetType); ArgumentUtility.CheckNotNull("methodsToOverride", methodsToOverride); ArgumentUtility.CheckNotNull("invocationHandler", invocationHandler); if (targetType.ContainsGenericParameters) { throw new NotSupportedException("Open generic target types are not supported by this type generator."); } _methodsToOverride = methodsToOverride; _invocationHandler = invocationHandler; string className = "DynamicMixinFor_" + targetType.Name; _baseCallInterface = BaseRequirements.BuildBaseRequirements(_methodsToOverride, className + "_BaseRequirements", scope); Type mixinBase = typeof(Mixin <,>).MakeGenericType(typeof(object), _baseCallInterface.RequirementsType); _emitter = new CustomClassEmitter(scope, className, mixinBase); _invocationHandlerField = _emitter.CreateStaticField("InvocationHandler", typeof(MethodInvocationHandler)); foreach (MethodInfo method in _methodsToOverride) { AddOverrider(method, _invocationHandlerField); } }
public static BaseRequirements BuildBaseRequirements(IEnumerable <MethodInfo> methodsToOverride, string typeName, ModuleScope scope) { ArgumentUtility.CheckNotNull("methodsToOverride", methodsToOverride); ArgumentUtility.CheckNotNullOrEmpty("typeName", typeName); ArgumentUtility.CheckNotNull("scope", scope); CustomClassEmitter requirementsInterface = new CustomClassEmitter(new InterfaceEmitter(scope, typeName)); Dictionary <MethodInfo, MethodInfo> methodToInterfaceMap = new Dictionary <MethodInfo, MethodInfo> (); foreach (MethodInfo method in methodsToOverride) { MethodInfo interfaceMethod = DefineEquivalentInterfaceMethod(requirementsInterface, method); methodToInterfaceMap.Add(method, interfaceMethod); } BaseRequirements result = new BaseRequirements(requirementsInterface.BuildType(), methodToInterfaceMap); return(result); }