private static bool interfaceContainsMember(Type interfaceType, MemberInfo member) { return interfaceType.GetMethods().Select( m => m.GetSignature() ).Contains(member.GetSignature()); }
public void RegisterDotNetNative(MemberInfo member, JSNative attribute) { List<MemberInfo> members; #if VALIDATION if (attribute.CallType != NativeCallType.Default && member is MethodBase && ((MethodBase)member).IsVirtual) { ThrowHelper.Throw("JSNative::CallType cannot be set for {0} since it is virtual.", member.GetSignature()); } #endif if (member.DeclaringType.IsGenericTypeDefinition) { if (!dotNetNativeMembersForType.TryGetValue(member.DeclaringType, out members)) { members = new List<MemberInfo>(); dotNetNativeMembersForType[member.DeclaringType] = members; } dotNetNativeMembersForType[member.DeclaringType].Add(member); } dotNetNatives[member] = attribute; }
public JSNative GetNative(MemberInfo member) { var attribtes = member.GetCustomAttributes(typeof(JSNative), true); if (attribtes.Length == 1) { return (JSNative)attribtes[0]; } else { JSNative attribute; if (dotNetNatives.TryGetValue(member, out attribute)) return attribute; else if (member is MethodInfo) { var methodInfo = (MethodInfo)member; MethodInfo degenericMethod = null; if (methodInfo.IsGenericMethod && dotNetNatives.TryGetValue(methodInfo.GetGenericMethodDefinition(), out attribute)) { return attribute; } else if (methodInfo.DeclaringType.IsGenericType) { degenericMethod = GetMethodOfGenericTypeThatMatch(methodInfo); if (degenericMethod != null && dotNetNatives.TryGetValue(degenericMethod, out attribute)) { return attribute; } } foreach (var @interface in methodInfo.DeclaringType.GetInterfaces()) { var mapping = methodInfo.DeclaringType.GetInterfaceMap(@interface); for (int i = 0; i < mapping.InterfaceMethods.Length; ++i) { if (mapping.TargetMethods[i] == methodInfo || mapping.TargetMethods[i] == degenericMethod) try { return GetNative(mapping.InterfaceMethods[i]); } catch { } } } //zeby np nie natiwowac ciagle X.ToString : Object.ToString var baseDefinition = methodInfo.GetBaseDefinition(); if (baseDefinition != methodInfo) { try { return GetNative(baseDefinition); } catch { } } } else if (member is ConstructorInfo) { var constructorInfo = (ConstructorInfo)member; if (constructorInfo.DeclaringType.IsGenericType && dotNetNatives.TryGetValue( constructorInfo.DeclaringType.GetGenericTypeDefinition().GetConstructor( (from p in constructorInfo.GetParameters() select p.ParameterType).ToArray() ), out attribute) ) { return attribute; } } ThrowHelper.Throw("Cannot resolve native {0}.", member.GetSignature()); return null; } }