private static bool interfaceContainsMember(Type interfaceType,
     MemberInfo member)
 {
     return interfaceType.GetMethods().Select(
         m => m.GetSignature()
     ).Contains(member.GetSignature());
 }
Пример #2
0
		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;
		}
Пример #3
0
		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;
			}
		}