C# 如何实例化泛型类

C# 如何实例化泛型类,c#,generics,C#,Generics,我有一个界面: public interface ICrawlService<T> where T : SocialPostBase { Task<int> Crawl(int accountId, Disguise disguise, ISocialAccountRepository socialAccountRepository, ISocialRepository<T> socialRepository, ISocialCrawlJobRepos

我有一个界面:

public interface ICrawlService<T> where T : SocialPostBase
{
    Task<int> Crawl(int accountId, Disguise disguise, ISocialAccountRepository socialAccountRepository, ISocialRepository<T> socialRepository, ISocialCrawlJobRepository jobRepository, IInstrumentationRepository instrumentationRepository);
}
crawlService = (ICrawlService<SocialPostBase>)new CrawlYoutubeProfileService();

crawlService = (ICrawlService<SocialPostBase>)new CrawlAnotherProfileService();
我的社交存储库是:

public interface ISocialRepository<T> where T : class
{
    IEnumerable<SocialPostCollection<T>> List { get; }
    Task Add(SocialPostCollection<T> entity, string type);

    Task AddPosts(List<T> entity, string type);

    void Delete(SocialPostCollection<T> entity);
    void Update(SocialPostCollection<T> entity);
    T Find(string profileName, MediaType type);
}
我正在寻找一个多态设计,这样我可以实例化成一个单一的类型不同的类。比如:

var socialRepo = new SocialRepository<Video>(configration.CosmosDBServiceEndpoint, configration.CosmosDBSecret, configration.CosmosDBDatabaseId);
var socialRepo2 = new SocialRepository<Post>(configration.CosmosDBServiceEndpoint, configration.CosmosDBSecret, configration.CosmosDBDatabaseId);

ICrawlService<SocialPostBase> crawlService;

crawlService = new CrawlYoutubeProfileService();
var id = await crawlService.Crawl(jobId, null, _socialAccountRepo, socialRepo, _socialCrawlJobRepo, instrumentationRepo);

crawlService = new CrawlAnotherProfileService();
var id2 = await crawlService.Crawl(jobId, null, _socialAccountRepo, socialRepo2, _socialCrawlJobRepo, instrumentationRepo);
但是它不会接受泛型参数的基类,我得到以下错误

无法隐式转换类型 “SocialCrawlServices.CrawlYouTube配置文件服务”到 “SocialCrawlService.ICrawlService”。 存在显式转换。是否缺少强制转换


那么,如何进行通用多态设计呢?这不可能吗?

错误表明存在显式转换,您是否缺少转换?。答案是显式地将实现类转换为接口:

public interface ICrawlService<T> where T : SocialPostBase
{
    Task<int> Crawl(int accountId, Disguise disguise, ISocialAccountRepository socialAccountRepository, ISocialRepository<T> socialRepository, ISocialCrawlJobRepository jobRepository, IInstrumentationRepository instrumentationRepository);
}
crawlService = (ICrawlService<SocialPostBase>)new CrawlYoutubeProfileService();

crawlService = (ICrawlService<SocialPostBase>)new CrawlAnotherProfileService();
这不可能吗

不,有可能。您只需要在ICrawlService中的泛型参数之前添加


请参阅。

使用ICrawlService定义接口,这样您也可以分配给定类型的派生类,因此对于从SocialPostBase派生的类型。执行此操作时,我的存储库失败:无效变量:类型参数“T”必须在“IsocialRepository”上始终有效,然后将其也放在那里。当然,他们必须适应。另一个选择是使用爬网并使接口非泛型。