using System.Collections.Generic;
public interface ISearchOptions
public class FooSearchOptions : ISearchOptions
public string Name => "aaa";
public class BaaSearchOptions : ISearchOptions
public string Name => "bbb";
public interface ISearchService<in TSearchOptions> where TSearchOptions : ISearchOptions
public class FooSearchService : ISearchService<FooSearchOptions>
public class BaaSearchService : ISearchService<BaaSearchOptions>
public static void Main()
var searchServices = new List<ISearchService<ISearchOptions>>