using System.Threading.Tasks;
using System.Collections.Generic;
public interface ConsumeContext
public interface MessageContext
public interface PipeContext {}
public interface IPublishEndpoint {}
public interface IPublishObserverConnector {}
public interface ISendEndpointProvider {}
public interface IMessage
Guid? MessageId { get; set; }
public class Message : IMessage
public Guid? MessageId { get; set; }
public class SpecificMessage : Message
public interface ConsumeContext<out T> : ConsumeContext, MessageContext, PipeContext, IPublishEndpoint, IPublishObserverConnector, ISendEndpointProvider where T : class
Task NotifyConsumed(TimeSpan duration, string consumerType);
Task NotifyFaulted(TimeSpan duration, string consumerType, Exception exception);
public class MyClass <T>: ConsumeContext<T> where T : class
public T Message { get; set; }
public Task NotifyConsumed(TimeSpan duration, string consumerType) { return null; }
public Task NotifyFaulted(TimeSpan duration, string consumerType, Exception exception) { return null; }
public static Guid? GetMessageId<T>(ConsumeContext<T> input) where T : class
var casted = input as ConsumeContext<IMessage>;
if (casted == null) return null;
return casted.Message.MessageId;
public static void Main()
var exampleObject = new MyClass<SpecificMessage>();
exampleObject.Message = new SpecificMessage { MessageId = new Guid("00000001-0002-0003-0004-000000000005") };
var messageId = GetMessageId(exampleObject);
Console.WriteLine(messageId.Value);