コード例 #1
0
        internal MessageDescription Get(Type messageType, Version messageVersion)
        {
            RequiresEx.NotNullSubtype <IMessage>(messageType, "messageType");
            Requires.NotNull(messageVersion, "messageVersion");

            MessageTypeAndVersion key = new MessageTypeAndVersion(messageType, messageVersion);

            MessageDescription result;

            lock (this.reflectedMessageTypes) {
                this.reflectedMessageTypes.TryGetValue(key, out result);
            }

            if (result == null)
            {
                // Construct the message outside the lock.
                var newDescription = new MessageDescription(messageType, messageVersion);

                // Then use the lock again to either acquire what someone else has created in the meantime, or
                // set and use our own result.
                lock (this.reflectedMessageTypes) {
                    if (!this.reflectedMessageTypes.TryGetValue(key, out result))
                    {
                        this.reflectedMessageTypes[key] = result = newDescription;
                    }
                }
            }

            return(result);
        }
コード例 #2
0
 /// <summary>
 /// Indicates whether this instance and a specified object are equal.
 /// </summary>
 /// <param name="obj">Another object to compare to.</param>
 /// <returns>
 /// true if <paramref name="obj"/> and this instance are the same type and represent the same value; otherwise, false.
 /// </returns>
 public override bool Equals(object obj)
 {
     if (obj is MessageTypeAndVersion)
     {
         MessageTypeAndVersion other = (MessageTypeAndVersion)obj;
         return(this.type == other.type && this.version == other.version);
     }
     else
     {
         return(false);
     }
 }
コード例 #3
0
        /// <summary>
        /// Initializes a new instance of the <see cref="MessageDescription"/> class.
        /// </summary>
        /// <param name="messageTypeAndVersion">The type and protocol version of the message to reflect over.</param>
        private MessageDescription(MessageTypeAndVersion messageTypeAndVersion)
        {
            ErrorUtilities.VerifyArgumentNotNull(messageTypeAndVersion, "messageTypeAndVersion");

            if (!typeof(IMessage).IsAssignableFrom(messageTypeAndVersion.Type))
            {
                throw new ArgumentException(string.Format(
                                                CultureInfo.CurrentCulture,
                                                MessagingStrings.UnexpectedType,
                                                typeof(IMessage),
                                                messageTypeAndVersion.Type));
            }

            this.messageTypeAndVersion = messageTypeAndVersion;
            this.ReflectMessageType();
        }
コード例 #4
0
		internal MessageDescription Get(Type messageType, Version messageVersion) {
			Contract.Requires<ArgumentNullException>(messageType != null);
			Contract.Requires<ArgumentException>(typeof(IMessage).IsAssignableFrom(messageType));
			Contract.Requires<ArgumentNullException>(messageVersion != null);
			Contract.Ensures(Contract.Result<MessageDescription>() != null);

			MessageTypeAndVersion key = new MessageTypeAndVersion(messageType, messageVersion);

			MessageDescription result;
			if (!this.reflectedMessageTypes.TryGetValue(key, out result)) {
				lock (this.reflectedMessageTypes) {
					if (!this.reflectedMessageTypes.TryGetValue(key, out result)) {
						this.reflectedMessageTypes[key] = result = new MessageDescription(messageType, messageVersion);
					}
				}
			}

			Contract.Assume(result != null, "We should never assign null values to this dictionary.");
			return result;
		}
コード例 #5
0
        /// <summary>
        /// Gets a <see cref="MessageDescription"/> instance prepared for the
        /// given message type.
        /// </summary>
        /// <param name="messageType">A type that implements <see cref="IMessage"/>.</param>
        /// <param name="messageVersion">The protocol version of the message.</param>
        /// <returns>A <see cref="MessageDescription"/> instance.</returns>
        internal static MessageDescription Get(Type messageType, Version messageVersion)
        {
            ErrorUtilities.VerifyArgumentNotNull(messageType, "messageType");
            ErrorUtilities.VerifyArgumentNotNull(messageVersion, "messageVersion");

            MessageTypeAndVersion key = new MessageTypeAndVersion(messageType, messageVersion);

            MessageDescription result;

            if (!reflectedMessageTypes.TryGetValue(key, out result))
            {
                lock (reflectedMessageTypes) {
                    if (!reflectedMessageTypes.TryGetValue(key, out result))
                    {
                        reflectedMessageTypes[key] = result = new MessageDescription(key);
                    }
                }
            }

            return(result);
        }
コード例 #6
0
        /// <summary>
        /// 根据消息类型和版本获取消息描述
        /// </summary>
        /// <param name="messageType"></param>
        /// <param name="messageVersion"></param>
        /// <returns></returns>
        public MessageDescription Get(Type messageType, Version messageVersion)
        {
            MessageTypeAndVersion key = new MessageTypeAndVersion(messageType, messageVersion);
            MessageDescription    result;

            lock (this.reflectedMessageTypes)
            {
                this.reflectedMessageTypes.TryGetValue(key, out result);
            }
            if (result == null)
            {
                var newDescription = new MessageDescription(messageType, messageVersion);
                lock (this.reflectedMessageTypes)
                {
                    if (!this.reflectedMessageTypes.TryGetValue(key, out result))
                    {
                        this.reflectedMessageTypes[key] = result = newDescription;
                    }
                }
            }

            return(result);
        }
コード例 #7
0
        internal MessageDescription Get(Type messageType, Version messageVersion)
        {
            Contract.Requires <ArgumentNullException>(messageType != null);
            Contract.Requires <ArgumentException>(typeof(IMessage).IsAssignableFrom(messageType));
            Contract.Requires <ArgumentNullException>(messageVersion != null);
            Contract.Ensures(Contract.Result <MessageDescription>() != null);

            MessageTypeAndVersion key = new MessageTypeAndVersion(messageType, messageVersion);

            MessageDescription result;

            if (!this.reflectedMessageTypes.TryGetValue(key, out result))
            {
                lock (this.reflectedMessageTypes) {
                    if (!this.reflectedMessageTypes.TryGetValue(key, out result))
                    {
                        this.reflectedMessageTypes[key] = result = new MessageDescription(messageType, messageVersion);
                    }
                }
            }

            Contract.Assume(result != null, "We should never assign null values to this dictionary.");
            return(result);
        }