在C#中,如何将接口转换为扩展接口的接口?
我有几个接口:在C#中,如何将接口转换为扩展接口的接口?,c#,lambda,interface,compiler-errors,C#,Lambda,Interface,Compiler Errors,我有几个接口: public interface ILockable { public string LockToken { get; set; } } interface ILockableSalesforceRecord : ILockable, ISalesforceRecordable { } public interface IServiceBusMessageReceiver { Ta
public interface ILockable
{
public string LockToken { get; set; }
}
interface ILockableSalesforceRecord : ILockable, ISalesforceRecordable
{
}
public interface IServiceBusMessageReceiver
{
Task DoWithAsync<T>(IQueueConfig queueConfig, Func<List<ILockable>, Task<bool>> function)
where T : ILockable;
}
公共接口ILockable
{
公共字符串锁令牌{get;set;}
}
接口ILockableSalesforceRecord:ILockable,IsalForceRecordable
{
}
公共接口IServiceBusMessageReceiver
{
任务DoWithAsync(iqueueEconfig queueConfig,Func函数)
其中T:ILockable;
}
我有一个带有这个签名的方法:
private async Task<bool> WriteToSalesforceCacheAsync<T>(List<ILockableSalesforceRecord> eventBusRecords, CancellationToken cancellationToken)
private async Task writeToSalesforceCacheAync(列出eventBusRecords、CancellationToken CancellationToken)
我想通过以下方法将其传递给最后一个接口的具体化:
public async Task WriteToSalesforceCacheAsync<T>(IQueueConfig queueConfig, CancellationToken cancellationToken)
where T : ISalesforceRecordable
{
await _serviceBusQueueReceiver.DoWithAsync<T>(queueConfig, async records =>
{
return await WriteToSalesforceCacheAsync<T>((List<ILockableSalesforceRecord>)records, cancellationToken)
.ConfigureAwait(false);
});
}
public async Task writeToSalesforceCacheAync(IQueueConfig queueConfig,CancellationToken CancellationToken)
其中T:IsalForceRecordable
{
wait\u serviceBusQueueReceiver.DoWithAsync(queueConfig,async records=>
{
return wait writeToSalesforceCacheAncync((列表)记录,cancellationToken)
.配置等待(错误);
});
}
但这无法通过以下方式编译:
严重性代码说明项目文件行抑制状态
错误CS0030无法将类型“System.Collections.Generic.List”转换为“System.Collections.Generic.List”Enpal.AzureServiceBustosFCacheTrancriber C:\projects\AzureServiceBustosFCacheTrancriber\AzureServiceBustosFCacheTrancriber\Helpers\RelayHelper.cs 38 Active
我可以/应该做些什么来解决这个问题吗?在您的界面中,您声明了一个泛型参数
T
,但实际上并没有在参数中使用它
您可能打算这样设计:
public interface IServiceBusMessageReceiver
{
Task DoWithAsync<T>(IQueueConfig queueConfig, Func<List<T>, Task<bool>> function)
where T : ILockable;
}
现在,由于ILockableSalesforceRecord
作为通用参数提供给DoWithAsync
,WriteToSalesforceCacheAync
随后被传递一个列表,代码编译:
另外,您不应该依赖接口签名中的特定集合类型,例如列表
,因为这对客户端是有限制的;而是使用依赖于需求的接口类型,例如IEnumerable
,ICollection
等。查看这篇文章可能会有所帮助:尝试在界面和cast中使用IList
而不是List
。但我要说的是,您使用此cast的事实似乎表明您在设计级别上做错了什么。请删除此cast,改用records.cast().ToList()
,或者records.OfType().ToList()
如果records
可能包含未实现的对象ILockableSalesforceRecord
这看起来像是列表与列表的问题。即使狮子是一种动物,也不能将动物列表投射到狮子列表中。你必须分别铸造每个元素(参见@MindSwipe的评论),这看起来很有希望。我明天试试这个。干杯!:-)
private async Task<bool> WriteToSalesforceCacheAsync(
List<ILockableSalesforceRecord> eventBusRecords, CancellationToken cancellationToken)
{
//...
}
public async Task WriteToSalesforceCacheAsync(
IQueueConfig queueConfig, CancellationToken cancellationToken)
{
await _serviceBusQueueReceiver.DoWithAsync<ILockableSalesforceRecord>(queueConfig,
async records =>
{
return await WriteToSalesforceCacheAsync(records, cancellationToken)
.ConfigureAwait(false);
});
}