コード例 #1
0
        public MethodInformation ResolveMethodInformation(MethodSignature signature)
        {
            MethodInformation returned;

            @lock.AcquireReaderLock(-1);

            if (methods.ContainsKey(signature.Type))
            {
                if (methods[signature.Type].ContainsKey(signature))
                {
                    returned = methods[signature.Type][signature];
                    @lock.ReleaseLock();
                    return(returned);
                }
            }

            @lock.UpgradeToWriterLock(-1);

            if (!methods.ContainsKey(signature.Type))
            {
                methods[signature.Type] = new Dictionary <MethodSignature, MethodInformation>();
            }

            var method = signature.Type.GetMethod(
                signature.Name, BindingFlags.Public | BindingFlags.Instance, null, signature.Types, new ParameterModifier[0]);

            if (method == null)
            {
                @lock.ReleaseLock();
                throw new MissingMethodException(
                          String.Format("Missing method: '{0}' on '{1}'", signature.Name, signature.Type.FullName));
            }

            returned = new MethodInformation(method, GetParameters(method), method.GetCustomAttributes(true));
            methods[signature.Type][signature] = returned;

            @lock.ReleaseLock();

            return(returned);
        }
コード例 #2
0
		public MethodInformation ResolveMethodInformation(MethodSignature signature)
		{
			MethodInformation returned;

			@lock.AcquireReaderLock(-1);

			if (methods.ContainsKey(signature.Type))
				if (methods[signature.Type].ContainsKey(signature))
				{
					returned = methods[signature.Type][signature];
					@lock.ReleaseLock();
					return returned;
				}
			
			@lock.UpgradeToWriterLock(-1);

			if (!methods.ContainsKey(signature.Type))
				methods[signature.Type] = new Dictionary<MethodSignature, MethodInformation>();
			
			var method = signature.Type.GetMethod(
				signature.Name, BindingFlags.Public | BindingFlags.Instance, null, signature.Types, new ParameterModifier[0]);
			
			if (method == null)
			{
				@lock.ReleaseLock();
				throw new MissingMethodException(
					String.Format("Missing method: '{0}' on '{1}'", signature.Name, signature.Type.FullName));
			}

			returned = new MethodInformation(method, GetParameters(method), method.GetCustomAttributes(true));
			methods[signature.Type][signature] = returned;

			@lock.ReleaseLock();

			return returned;
		}