コード例 #1
0
        /// <summary>
        /// Create a dynamic type representation of a method
        /// </summary>
        public static DynamicInvoke CreateDynamicInvoke(this MethodInfo methodInfo)
        {
            if (methodInfo == null)
            {
                throw new ArgumentNullException(nameof(methodInfo));
            }

            var invokeDelegate = FluentIl.CreateInvoke(methodInfo);
            var access         = GetAccessModifiers(methodInfo);
            var visibility     = GetVisibilityModifiers(methodInfo);

            return(new DynamicInvoke(methodInfo, access, visibility, invokeDelegate));
        }
コード例 #2
0
        /// <summary>
        /// Create a dynamic type representation of a constructor
        /// </summary>
        public static DynamicCtor CreateDynamicCtor(this ConstructorInfo constructorInfo, bool allowNonPublic = true)
        {
            if (constructorInfo == null)
            {
                throw new ArgumentNullException(nameof(constructorInfo));
            }

            var declaringType = constructorInfo.DeclaringType;
            var ctorDelegate  = FluentIl.CreateConstructor(declaringType, constructorInfo, allowNonPublic);
            var access        = GetAccessModifiers(constructorInfo);
            var visibility    = GetVisibilityModifiers(constructorInfo);

            return(new DynamicCtor(declaringType, constructorInfo, access, visibility, ctorDelegate));
        }
コード例 #3
0
        /// <summary>
        /// Create a dynamic type representation of a setter
        /// </summary>
        public static DynamicSetter CreateDynamicSetter(this FieldInfo fieldInfo)
        {
            if (fieldInfo == null)
            {
                throw new ArgumentNullException(nameof(fieldInfo));
            }

            var setterDelegate = FluentIl.CreateSetter(fieldInfo);

            if (setterDelegate == null)
            {
                return(null);
            }
            var access     = GetAccessModifiers(fieldInfo);
            var visibility = GetVisibilityModifiers(fieldInfo);

            return(new DynamicSetter(access, visibility, setterDelegate));
        }
コード例 #4
0
        /// <summary>
        /// Create a dynamic type representation of a setter
        /// </summary>
        public static DynamicSetter CreateDynamicSetter(this PropertyInfo propertyInfo)
        {
            if (propertyInfo == null)
            {
                throw new ArgumentNullException(nameof(propertyInfo));
            }

            var setterDelegate = FluentIl.CreateSetter(propertyInfo);

            if (setterDelegate == null)
            {
                return(null);
            }
            var setMethod  = propertyInfo.GetSetMethod(true);
            var access     = GetAccessModifiers(setMethod);
            var visibility = GetVisibilityModifiers(setMethod);

            return(new DynamicSetter(access, visibility, setterDelegate));
        }
コード例 #5
0
        /// <summary>
        /// Create a dynamic type representation of a constructor
        /// </summary>
        public static DynamicCtor CreateDynamicCtor(this Type declaringType, Type[] parameterTypes,
                                                    bool allowNonPublic = true)
        {
            if (declaringType == null)
            {
                throw new ArgumentNullException(nameof(declaringType));
            }

            var binderFlags = BindingFlags.Instance | BindingFlags.Public;

            if (allowNonPublic)
            {
                binderFlags |= BindingFlags.NonPublic;
            }

            var                 constructorInfo = declaringType.GetConstructor(binderFlags, null, parameterTypes, null);
            CtorDelegate        ctorDelegate;
            AccessModifiers     access;
            VisibilityModifiers visibility;

            if (constructorInfo == null)
            {
                if ((parameterTypes.Length != 0) || (declaringType.IsValueType == false))
                {
                    throw new InvalidOperationException("Constructor is not defined");
                }
                ctorDelegate = FluentIl.CreateConstructor(declaringType, null, allowNonPublic);
                access       = GetAccessModifiers(declaringType);
                visibility   = GetVisibilityModifiers(declaringType);
            }
            else
            {
                ctorDelegate = FluentIl.CreateConstructor(declaringType, constructorInfo, allowNonPublic);
                access       = GetAccessModifiers(constructorInfo);
                visibility   = GetVisibilityModifiers(constructorInfo);
            }
            return(new DynamicCtor(declaringType, constructorInfo, access, visibility, ctorDelegate));
        }
コード例 #6
0
        private static GetterDelegate CreateAccessor(Type taskType)
        {
            var propertyInfo = taskType.GetProperty("Result");

            return(propertyInfo != null?FluentIl.CreateGetter(propertyInfo) : null);
        }