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); }
/// <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); } }
/// <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(); }
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; }
/// <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); }
/// <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); }
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); }