class Listing : Aggregate {}
interface IAggregateAction<TA, out TB> : IAction<TA> where TB : Aggregate {
class CreateListingAction: IAggregateAction<string, Listing> {}
static void Main(string[] args)
var myAction = new CreateListingAction();
Console.WriteLine($"myAction is IAction<string> {myAction is IAction<string>}");
Console.WriteLine($"myAction is IAction<string> {myAction is not null}");
Console.WriteLine($"myAction is IAggregateAction<string,Listing> {myAction is IAggregateAction<string,Listing>}");
Console.WriteLine($"myAction is IAggregateAction<string,Aggregate> {myAction is IAggregateAction<string,Aggregate>}");
IAggregateAction<string, Aggregate> myAggregateAction = myAction as IAggregateAction<string, Aggregate>;
Console.WriteLine($"Cast success?: {myAggregateAction != null}");