【问题标题】:Determine datatype parameter for generic used in interface确定接口中使用的泛型的数据类型参数
【发布时间】:2015-07-23 10:52:23
【问题描述】:

我正在努力寻找一个优雅的解决方案来确定接口中用作抽象类中的泛型参数的数据类型。

抽象类:

public abstract class Entity<T>
{
    /// <summary>
    /// Object Identifier
    /// </summary>
    public T Id { get; set; }
}

具体类:

public class Department: Entity<int>
{
  // Additional properties
}

public class Employee: Entity<long>
{
  // Additional properties
}

接口实现:

public interface IService<T1, T2> 
where T1 : Entity<?> 
where T2 : Entity<?>
{
  Task TransferEmployeeToDepartment(? departmentId, ? employeeId);
}

解决问题的方法是将数据类型作为附加参数发送,但出于个人和强迫症的原因,我不喜欢这样做。有没有办法解决这个问题?

【问题讨论】:

  • 为什么名为TransferEmployeeToDepartment 的方法必须是通用的?为什么不这样写:Task TransferEmployeeToDepartment(Department department, Employee employee)??
  • 对 Department 和 Employee 对象的额外查找对数据库来说是不必要的开销,因为 id 将通过前端的 web api 传递给服务。
  • 因此,您不想从数据库中加载这些对象。好的。如果有足够多的了解部门 ID 和员工 ID,请编写如下内容:Task TransferEmployeeToDepartment(int departmentId, long employeeId)。在这里使用泛型的原因是什么?您的方法中应该包含哪些通用代码?
  • @Dennis - 只是为了能够灵活地为其他类(如承包商、护士等)重用接口。我只是在扩展功能,不能为此更改设计或数据类型,所以我没有为每个接口编写一个接口,而是尝试采用通用路线来简化维护和支持。实现后的接口将解析数据类型(int/long),然后将数据传递到要保存在数据库中的存储库。

标签: c# class generics parameters interface


【解决方案1】:

同意丹尼斯的评论。根据您的方法名称,您将具体类Employee 转移到具体类Department。这里没有什么通用的。
因此,如果您只想传输这两个实体,您的代码应该是这样的

public class Department: Entity<int>
{
  // Additional properties
}

public class Employee: Entity<long>
{
  // Additional properties

    public Department TransferToDepartment() {} //implementation here
}

如果您的目标是将任何实体转移到任何其他实体,我会将您的界面改造成以下方式

public interface IService<T1, T2>
{
    Task TransferEmployeeToDepartment(Entity<T1> entityFrom, Entity<T2> entityTo);
}

但是,如果您是一组几乎不相关的实体(例如部门和员工),我怀疑是否有可能为此编写一些好的通用代码

【讨论】:

  • 感谢您的界面建议,这绝对可以。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-09-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-04-28
相关资源
最近更新 更多