【问题标题】:How can i create an interface in C# that has an arbitrary number of generic parameters ?如何在 C# 中创建具有任意数量的泛型参数的接口?
【发布时间】:2018-02-04 19:14:45
【问题描述】:

所以最近我偶然发现了一个关于 c# 效率的 youtube 视频(我不确定我是否可以链接它),主要是为统一引擎游戏编写高效代码。因此,在视频中的某个时刻,他展示了一个结构,该结构实现了具有任意数量的通用参数的接口。这是一张图片来说明他的所作所为:

我试图复制的接口是 IJobsProcess。所以我从他在视频中所说的得到的是,接口可以采用任意数量的泛型参数。总之,我怎样才能在 C# 中创建这样的接口? 如果我在这里说错了,请纠正我。

【问题讨论】:

  • 我认为您没有正确理解,没有办法拥有任意数量的泛型参数。图中的接口有2个泛型类型参数
  • 不确定这是否是您要查找的内容,但您可以在 C# 中使用 params object[] args 参数来允许将 0-many 对象参数传递给方法。
  • 你能粘贴视频链接吗,只是好奇..
  • 这是 56:11"youtu.be/tGmnZdY5Y-E?t=56m11s" 的视频链接,大约在这个时候,他展示了上述实现

标签: c# generics unity3d parameters interface


【解决方案1】:

您可以使用任意数量的generic parameters 编写和实现接口。但是您不能编写具有任意数量的泛型参数的接口。

这是给你的例子:

interface IService<T1, T2>
{
    T1 GetValue();
    T2 GetAnotherValue();
}
class MyClass : IService<string, int>
{
    public int GetAnotherValue()
    {
        return 42;
    }

    public string GetValue()
    {
        return "Truth";
    }
}

正如您在上面看到的,泛型参数的数量可以大于 1,但该数量在编译时是固定的。

herehere 也提出了同样的问题。在这些问题中,提到的替代方案很少,其中任意数量的类型参数是使用其他常见的已知 C# 功能实现的:使用 params 关键字或将 array of types 作为参数传递。

【讨论】:

  • 我明白你的意思,尽管如此,如果我可以在 55:46 提供指向视频“youtube.com/watch?v=tGmnZdY5Y-E”的链接,他实现了上述代码,我能否了解他在做什么在那里,从你的角度来看?我有点困惑,现在仍然如此。
  • 在视频中,这个家伙只展示了普通的 good-old-generic 类型(带有 2 个通用参数)。基本上它与我的示例相同。在我的示例中,IService 接口采用 T1 和 T2,MyClass 使用 T1=string 和 T2=int 实现 IService。在视频中,实现类是 GravityMinionJob,它使用通用类型 T1=MinionVelocity 和 T2=RotationSpeed 实现了 IJobProcessComponentData。我想您现在可以将此问题标记为已回答。
  • 所以底线是,他只是有多个通用接口的实现,比如 MyInterface 或 MyInterface 或 Myinterface 等。我想?
  • 是的,他有多个独立的接口,具有不同数量的泛型参数。
  • Action Func 类就是一个很好的例子。我认为他们有 9 个不同的版本,从无参数到 8 个参数。referencesource.microsoft.com/#mscorlib/system/… 所以没有泛型的参数样式案例。这就是使它们成为强类型的原因。它是明确开放的,但在编译时,类型已明确定义。
猜你喜欢
  • 2022-08-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-05-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多