Пример #1
0
        /// <summary>
        /// 为方法创建一个指定类型的委托。
        /// </summary>
        /// <typeparam name="T">指定委托类型</typeparam>
        /// <param name="methodInfo">方法</param>
        /// <param name="signatureLevel">签名等级</param>
        /// <returns>返回指定类型的委托</returns>
        public static T CreateDelegate <T>(MethodBase methodInfo, SignatureLevels signatureLevel = SignatureLevels.Consistent) where T : Delegate
        {
            var delegateType = typeof(T);

            var @delegate = InternalCreateDelegate(delegateType, methodInfo, signatureLevel);

            return((T)@delegate);
        }
        public DateTime?GetLastUpdate()
        {
            SignatureLevels firstOrDefault = null;

            _storage.Batch(accessor => { firstOrDefault = accessor.GetSignatures(_fileName).FirstOrDefault(); });

            if (firstOrDefault == null)
            {
                return(null);
            }

            return(firstOrDefault.CreatedAt);
        }
Пример #3
0
 /// <summary>
 /// 为方法创建一个指定类型的委托。
 /// </summary>
 /// <param name="delegateType">指定委托类型</param>
 /// <param name="methodInfo">方法</param>
 /// <param name="signatureLevel">签名等级</param>
 /// <returns>返回指定类型的委托</returns>
 public static Delegate CreateDelegate(Type delegateType, MethodBase methodInfo, SignatureLevels signatureLevel = SignatureLevels.Consistent)
 {
     return(InternalCreateDelegate(delegateType, methodInfo, signatureLevel));
 }
Пример #4
0
        private static Delegate InternalCreateDelegate(Type delegateType, MethodBase methodInfo, SignatureLevels signatureLevel)
        {
            if (delegateType == null)
            {
                throw new ArgumentNullException(nameof(delegateType));
            }

            if (methodInfo == null)
            {
                throw new ArgumentNullException(nameof(methodInfo));
            }

            if (methodInfo.ContainsGenericParameters)
            {
                throw new ArgumentException("Cannot create a delegate for a generic method.");
            }

            GetParametersTypes(delegateType, out var ps1, out var rt1);
            GetParametersTypes(methodInfo, out var ps2, out var rt2);

            if (ps1.Length != ps2.Length)
            {
                throw new ArgumentException("Number of parameters do not match.");
            }

            if (signatureLevel == SignatureLevels.Cast)
            {
                if (!CastEquals(rt1, rt2))
                {
                    throw new ArgumentException("Return value signature does not match.");
                }

                for (int i = 0; i < ps1.Length; i++)
                {
                    if (!CastEquals(ps1[i], ps2[i]))
                    {
                        throw new ArgumentException("Parameter signatures do not match.");
                    }
                }
            }
            else if (signatureLevel == SignatureLevels.Consistent)
            {
                if (rt1 != rt2)
                {
                    throw new ArgumentException("Return value signature does not match.");
                }

                for (int i = 0; i < ps1.Length; i++)
                {
                    if (ps1[i] != ps2[i])
                    {
                        throw new ArgumentException("Parameter signatures do not match.");
                    }
                }
            }

            var createWay = ChooseCreateWays(methodInfo);

            if ((createWay & CreateWays.Pointer) != 0)
            {
                try
                {
                    return(CreateDelegateByPointer(delegateType, methodInfo));
                }
                catch (Exception)
                {
                }
            }

            if ((createWay & CreateWays.Default) != 0)
            {
                try
                {
                    return(Delegate.CreateDelegate(delegateType, (MethodInfo)methodInfo));
                }
                catch (Exception)
                {
                }
            }

            if ((createWay & CreateWays.Proxy) != 0)
            {
                try
                {
                    return(CreateDelegateByProxy(delegateType, methodInfo));
                }
                catch (Exception)
                {
                }
            }

            try
            {
                return(CreateDelegateByPointer(delegateType, methodInfo));
            }
            catch (Exception)
            {
            }

            throw new NotSupportedException("Failed to create delegate.");
        }
Пример #5
0
        /// <summary>
        /// 为方法创建一个指定类型的委托。
        /// </summary>
        /// <typeparam name="T">指定委托类型</typeparam>
        /// <param name="methodInfo">方法</param>
        /// <param name="signatureLevel">签名等级</param>
        /// <returns>返回指定类型的委托</returns>
        public static T CreateDelegate <T>(MethodBase methodInfo, SignatureLevels signatureLevel = SignatureLevels.Consistent)
        {
            var delegateType = typeof(T);

            return((T)(object)InternalCreateDelegate(delegateType, methodInfo, signatureLevel));
        }