我有一个基本DLL,它定义了我们业务中关键概念的一些基本结构和操作。然后,此dll将包含在每个供应商的特定Web服务中,这些供应商实现与该供应商交互的特定业务规则。 (虽然基本概念是相同的,但实现方式非常不同,可以独立更改。)
在base dll中我设置了一系列接口
public interface IVendor
{
string Name { get; set; }
}
public interface IVendor<TC> : IVendor where TC : IAccount
{
IEnumerable<TC> Accounts { get; set; }
}
public interface IAccount
{
string Name { get; set; }
}
public interface IAccount<TP, TC> : IAccount where TP : IVendor
where TC : IExecutionPeriod
{
TP Vendor{ get; set; }
IEnumerable<TC> ExecutionPeriods { get; set; }
}
这继续下去几层,一切都很好。
当我尝试在服务中实现此问题时,问题出现了。
public class FirstVendor : IVendor<FirstVendorAccount>
{
public string Name { get; set; }
public IEnumerable<FirstVendorAccount> Accounts { get; set;}
}
public class FirstVendorAccount : IAccount<FirstVendor, FirstVendorExecutionPeriod>
{
public FirstVendor Vendor { get; set; }
public string Name { get; set; }
public IEnumerable<FirstVendorExecutionPeriod> ExecutionPeriods { get; set; }
}
我收到编译错误,IVendor,IAccount等没有类型参数。这特别奇怪,因为当我要求它实现接口时,它包括来自两个相关接口的所有成员。
答案 0 :(得分:1)
看起来你有一个循环引用 - FirstVendorAccount
需要知道FirstVendor
才能编译,反之亦然。
使用泛型类型创建其中一个“显性”类,然后另一个可以返回基本接口。
例如:
public interface IVendor
{
string Name { get; set; }
}
public interface IVendor<TC> : IVendor where TC : IAccount
{
IEnumerable<TC> Accounts { get; set; }
}
public interface IAccount
{
string Name { get; set; }
}
// no longer needs IVendor<TC> before it can be compiled
public interface IAccount<TC> : IAccount where TC : IExecutionPeriod
{
IVendor Vendor{ get; set; }
IEnumerable<TC> ExecutionPeriods { get; set; }
}
值得看看你是否真的需要所有通用类型 - 你可能会更好地使用非通用底层接口,因为这些接口编码会更容易。