/// <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); }
/// <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)); }
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."); }
/// <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)); }