【问题标题】:Best way to accept a generic method argument [closed]接受泛型方法参数的最佳方式[关闭]
【发布时间】:2012-10-16 14:06:28
【问题描述】:

我有一个界面,它描述了一种对在某个存储库中查找的某些项目执行某些操作的方法。

我看到了两种创建该界面的方法。

public interface IService<T> where T : class
{
    void Action<TSource>(int id, TSource source, Action<T> action)
        where TSource : IRead<T>;
}

public interface IService<T> where T : class
{
    void Action(int id, IRead<T> source, Action<T> action);
}

那么,哪一个是最好的,为什么?

【问题讨论】:

  • 你想在这里实现什么?问题是什么?答案完全取决于您的问题。
  • 对你来说有什么不同?如果您不需要“类”约束(因此您可以接受值类型),那么它们是等价的。
  • 没有实际问题。然而。像往常一样,我事先要求避免将来出现问题,并对 C# 有更完整的了解。
  • ...你预先设计所有东西并且不管什么都不会改变的时代已经过去了......现在你只根据需要做尽可能多的设计,注意 YAGNI(你不需要它),KISS(保持简单愚蠢)并灵活工作并“拥抱”(嗯......不是真正拥抱而是期待)改变......所以不要担心,并采取更简单的第二个版本跨度>
  • 我认为这是一个合理的设计问题,即使没有考虑特定的场景。

标签: c# generics methods interface repository


【解决方案1】:

在这里,我会说第二个更好。

第一个定义将允许您在 Action 的实现中直接使用 TSource(而不是通过它必须实现的接口 IRead)。现在,我能想象的唯一好的用途是在你的函数签名中使用 TSource ,你没有这样做。即类似:

TSource MyAction<TSource>(int id, TSource source, Action<T, TSource> action)
        where TSource : IRead<T>; // TSource is now also returned from our method

在任何其他情况下,MyAction 的主体(请注意,我冒昧地重命名您的示例方法以不与 System.Action 冲突)只知道和使用 IRead 接口会更好。

【讨论】:

    猜你喜欢
    • 2016-01-29
    • 1970-01-01
    • 2011-10-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-12-23
    相关资源
    最近更新 更多