我试图了解如何在我的用例中使用约束。这是伪代码:
public interface IEmployee
{
string Name { get; }
int Id { get; }
}
public class Processor<T> where T : IEmployee
{
public T Process()
{
...
}
}
现在我有一个新的用例,我可以返回一个
IEmployee
数组,据我所知,无法将其指定为约束:
一个快速修复方法是简单地注释掉原始的通用约束并具有:
public class Processor<T> /*where T : IEmployee */
我想知道是否有其他替代解决方案要求程序员在 IEmployee[] 数组类型的情况下传递正确的类型(我的接口的实现)。
更新。最后两种语法都应该编译:
public record Employee(string Name, int Id) : IEmployee;
public class Processor1 : Processor<Employee> {...}
public class Processor2 : Processor<Employee[]> {...}
更新2:我的问题是不是关于重写现有框架或更改API。我只需要表达一个约束,这样当程序员没有返回正确的类型时,我就会遇到编译时失败。
如何表达这样的编译时间限制?
public record Employee(string Name, int Id) : IEmployee;
public class Processor1 : Processor<Employee> {...}
public class Processor2 : Processor<Employee[]> {...}
没有办法在保持限制的情况下使这两者都起作用。一个项目与所述项目的集合不同。
有几种可能的替代方案:
T[] Process()
。单个员工的情况可以通过创建一个包含一名员工的数组来处理。where T : IEnumerable<IEmployee>
。这将使 class Processor2 : Processor<Employee[]>
正常工作。您需要将类型限制为只读集合接口,以防止有人尝试将其他员工类型添加到数组中。很难从给定的上下文中判断哪个选项最合适。