【问题标题】:C# interface access implementers type for generic泛型的 C# 接口访问实现者类型
【发布时间】:2015-04-17 11:04:13
【问题描述】:

有没有办法让实现类的接口自动通用?

例如,我想创建一个从实现类返回委托的接口。 (其实我希望它返回一个包含多个函数的数组,但我这里简化了。)

以下应该有效:

public interface IParentFinder<ChildClass> 
{
    Func<ChildClass, int> GetParentIdFunction();
}

然后要实现它,我必须这样写:

public class AClass : IParentFinder<AClass>
{
    int id;
    int parentId;

    static public Func<AClass, int> GetParentIdFunction()
    {
        return c => c.parentId;
    }
}

但是,我只希望在通用模板与实现类匹配的情况下使用此接口。有什么方便我可以使用的,所以我可以写这个:

public class AClass : IParentFinder
{
    ...
}

我希望有一些baseType 参数可以用来指定泛型的基本类型。例如:

public interface IParentFinder
{
    Func <baseType, int> GetParentIdFunction();
}

为清晰起见进行了编辑

【问题讨论】:

  • 我认为你需要考虑一个抽象类,而不是一个接口
  • 所以你会像非泛型接口一样实现它并期望它像泛型一样工作?如果你还有一个同名的非泛型接口怎么办?
  • 不,没有办法按照你的要求去做,至少不是那样。你想达到什么目的?为什么需要直接返回 lambda 表达式而不是 parent id?
  • 我本来希望有一个静态接口,但这些在 C# 中是不可能的。这是为了解决这个问题。我想找出一个类所具有的关系列表,因此我可以将它与我正在寻找的具有特定 ID 的关系列表进行比较。

标签: c# generics interface


【解决方案1】:

与任何其他参数一样,无论是方法参数还是泛型参数,泛型接口类型参数需要一个实参。没有参数的参数根本不是参数。

也许 C# vNext 可以实现类似默认泛型参数值的东西:

public class A<T> where T : default(string) { ... }

...或者谁知道呢。但是,就目前而言,泛型参数需要一个参数。而且,毕竟,这不适合您的情况 - 自动魔术推断的通用参数...... -.

【讨论】:

    【解决方案2】:

    不,C# 中没有这样做的功能。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-04-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多