/// <summary> /// Initializes and caches the metastate values /// necessary to invoke the method /// </summary> public void PrepForInvocation() { if (!_initialized) { lock (MethodInfo) { if (!_initialized) { DynamicMethod = DynamicMethodHandlerFactory.CreateMethod(MethodInfo); Parameters = MethodInfo.GetParameters(); TakesParamArray = (Parameters.Length == 1 && Parameters[0].ParameterType.Equals(typeof(object[]))); IsInjected = new bool[Parameters.Length]; int index = 0; foreach (var item in Parameters) { if (item.GetCustomAttributes <InjectAttribute>().Any()) { IsInjected[index] = true; } index++; } IsAsyncTask = (MethodInfo.ReturnType == typeof(Task)); IsAsyncTaskObject = (MethodInfo.ReturnType.IsGenericType && (MethodInfo.ReturnType.GetGenericTypeDefinition() == typeof(Task <>))); DataPortalMethodInfo = new DataPortalMethodInfo(MethodInfo); _initialized = true; } } } }
public DynamicMethodHandle(System.Reflection.MethodInfo info, params object[] parameters) { if (info == null) { this.DynamicMethod = null; } else { this.MethodName = info.Name; var infoParams = info.GetParameters(); object[] inParams = null; if (parameters == null) { inParams = new object[] { null }; } else { inParams = parameters; } var pCount = infoParams.Length; if (pCount > 0 && ((pCount == 1 && infoParams[0].ParameterType.IsArray) || (infoParams[pCount - 1].GetCustomAttributes(typeof(ParamArrayAttribute), true).Length > 0))) { this.HasFinalArrayParam = true; this.MethodParamsLength = pCount; this.FinalArrayElementType = infoParams[pCount - 1].ParameterType; } this.DynamicMethod = DynamicMethodHandlerFactory.CreateMethod(info); } }
private static DynamicCtorDelegate GetCachedConstructor(Type objectType) { DynamicCtorDelegate result = null; if (!_ctorCache.TryGetValue(objectType, out result)) { lock (_ctorCache) { if (!_ctorCache.TryGetValue(objectType, out result)) { ConstructorInfo info = objectType.GetConstructor(ctorFlags, null, Type.EmptyTypes, null); if (info == null) { throw new NotSupportedException(string.Format( CultureInfo.CurrentCulture, "Cannot create instance of Type '{0}'. No public parameterless constructor found.", objectType)); } result = DynamicMethodHandlerFactory.CreateConstructor(info); _ctorCache.Add(objectType, result); } } } return(result); }
public DynamicMemberHandle(FieldInfo info) : this( info.Name, info.FieldType, DynamicMethodHandlerFactory.CreateFieldGetter(info), DynamicMethodHandlerFactory.CreateFieldSetter(info)) { }
public DynamicMemberHandle(PropertyInfo info) : this( info.Name, info.PropertyType, DynamicMethodHandlerFactory.CreatePropertyGetter(info), DynamicMethodHandlerFactory.CreatePropertySetter(info)) { }
public DynamicMethodHandle(System.Reflection.MethodInfo info, params object[] parameters) { if (info == null) { this.DynamicMethod = null; } else { this.MethodName = info.Name; var infoParams = info.GetParameters(); object[] inParams = null; if (parameters == null) { inParams = new object[] { null }; } else { inParams = parameters; } var pCount = infoParams.Length; #if NETFX_CORE var isgeneric = info.ReturnType.IsGenericType(); if (pCount > 0 && ((pCount == 1 && infoParams[0].ParameterType.IsArray) || (infoParams[pCount - 1].GetCustomAttributes(typeof(ParamArrayAttribute), true).Count() > 0))) #else var isgeneric = info.ReturnType.IsGenericType; if (pCount > 0 && ((pCount == 1 && infoParams[0].ParameterType.IsArray) || (infoParams[pCount - 1].GetCustomAttributes(typeof(ParamArrayAttribute), true).Length > 0))) #endif { this.HasFinalArrayParam = true; this.MethodParamsLength = pCount; this.FinalArrayElementType = infoParams[pCount - 1].ParameterType; } IsAsyncTask = (info.ReturnType == typeof(System.Threading.Tasks.Task)); IsAsyncTaskObject = (isgeneric && (info.ReturnType.GetGenericTypeDefinition() == typeof(System.Threading.Tasks.Task <>))); this.DynamicMethod = DynamicMethodHandlerFactory.CreateMethod(info); } }
private static DynamicCtorDelegate GetCachedConstructor(Type objectType) { DynamicCtorDelegate result = null; var found = false; try { found = _ctorCache.TryGetValue(objectType, out result); } catch { /* failure will drop into !found block */ } if (!found) { lock (_ctorCache) { if (!_ctorCache.TryGetValue(objectType, out result)) { #if NETFX_CORE ConstructorInfo info = objectType.GetConstructor(ctorFlags, null, new Type[] { }, null); #else ConstructorInfo info = objectType.GetConstructor(ctorFlags, null, Type.EmptyTypes, null); #endif if (info == null) { throw new NotSupportedException(string.Format( CultureInfo.CurrentCulture, "Cannot create instance of Type '{0}'. No public parameterless constructor found.", objectType)); } result = DynamicMethodHandlerFactory.CreateConstructor(info); _ctorCache.Add(objectType, result); } } } return(result); }