private static object TryBind(CallableMember member, object receiver) { Contract.Requires(member != null && receiver != null); var memberType = member.GetType(); var method = memberType.GetMethod("Bind"); // this method only exists on CallableMember<T> but not on CallableMember return(method.Invoke(member, new[] { receiver })); // returns CallableValue<T> }
private static string RenderCallableSignature(CallableMember cm) { if (cm.MaxArity == short.MaxValue) { return(cm.Rest ? "...args" : "args[]"); } else { return(string.Join(", ", Enumerable .Range(0, cm.MaxArity) .Select(idx => Invariant( "{0}arg{1}{2}", idx == cm.MaxArity - 1 && cm.Rest ? "..." : string.Empty, idx, idx >= cm.MinArity ? "?" : string.Empty)))); } }
private object TryBind(CallableMember member, object receiver) { Contract.Requires(member != null && receiver != null); try { var memberType = member.GetType(); var method = memberType.GetMethod("Bind"); // this method only exists on CallableMember<T> but not on CallableMember return(method.Invoke(member, new[] { receiver })); // returns CallableValue<T> } catch (Exception e) { // should not happen, because all our CallableMember objects are also CallableMember<T>, // and the only client of this method ('GetAmbientProperties') ensures that 'receiver' is of type T. m_state.Logger.ReportDebuggerRendererFailedToBindCallableMember(m_state.LoggingContext, member.GetType().FullName, receiver.GetType().FullName, e.GetLogEventMessage()); return(null); } }
/// <summary> /// Creates member function instance from delegate <paramref name="function"/>. /// </summary> public CallableMember <T> Create <T>(SymbolAtom namespaceName, SymbolAtom name, CallableMemberSignature0 <T> function) => CallableMember.Create <T>(namespaceName, name, function, StringTable);
/// <summary> /// Creates member function instance from delegate <paramref name="function"/>. /// </summary> public CallableMember <T> CreateN <T>(SymbolAtom namespaceName, SymbolAtom name, CallableMemberSignatureN <T> function, short minArity, short maxArity) => CallableMember.CreateN <T>(namespaceName, name, function, StringTable, minArity, maxArity);
/// <summary> /// Creates member function instance from delegate <paramref name="function"/>. /// </summary> public CallableMember <T> Create <T>(SymbolAtom namespaceName, SymbolAtom name, CallableMemberSignature2 <T> function, short requiredNumberOfArguments = 2) => CallableMember.Create <T>(namespaceName, name, function, StringTable, requiredNumberOfArguments);
/// <summary> /// Creates member function instance from delegate <paramref name="function"/>. /// </summary> public CallableMember <T> Create <T>(SymbolAtom namespaceName, SymbolAtom name, CallableMemberSignature1 <T> function, bool rest = false, short minArity = 1) => CallableMember.Create <T>(namespaceName, name, function, StringTable, rest, minArity);