C# 如何使用具有泛型参数的类型作为约束?

C# 如何使用具有泛型参数的类型作为约束?,c#,generics,constraints,C#,Generics,Constraints,我想指定一个约束,它是另一种带有泛型参数的类型 class KeyFrame<T> { public float Time; public T Value; } // I want any kind of Keyframe to be accepted class Timeline<T> where T : Keyframe<*> { } 类关键帧 { 公共浮动时间; 公共价值观; } //我希望接受任何类型的关键帧 类时间轴,其中T:关键

我想指定一个约束,它是另一种带有泛型参数的类型

class KeyFrame<T>
{
    public float Time;
    public T Value;
}

// I want any kind of Keyframe to be accepted
class Timeline<T> where T : Keyframe<*>
{
}
类关键帧
{
公共浮动时间;
公共价值观;
}
//我希望接受任何类型的关键帧
类时间轴,其中T:关键帧
{
}
但到目前为止,这还不能在c#中实现(我真的怀疑它是否会实现)。除了指定关键帧参数的类型之外,还有什么优雅的解决方案吗

class Timeline<TKeyframe, TKeyframeValue> 
     where TKeyframe : Keyframe<TKeyframeValue>,
{
}
课程时间表
其中TKeyframe:关键帧,
{
}

因为时间轴很可能是关键帧的集合,所以不会像:

class TimeLine<T>
{
private IList<KeyFrame<T>> keyFrameList;
...
}
课程时间表
{
私人律师;
...
}

很好地满足您的需求?

如果
时间线
表示的类型T与
关键帧
表示的类型相同,您可以选择:

class Timeline<T>
{
  List<KeyFrame<T>> _frames = new List<KeyFrame<T>>(); //Or whatever...

  ...
}
课程时间表
{
List _frames=new List();//或其他什么。。。
...
}
如果类型T表示类之间的不同,这意味着
时间线
可以包含多种类型的
关键帧
,在这种情况下,您应该创建一个更抽象的
关键帧
实现,并在
时间线
中使用它 基本上,您必须找到一种方法来引用所需的类型,而无需指定辅助类型参数

在他的帖子中,他展示了一个可能的解决方案:

public abstract class FooBase
{
  private FooBase() {} // Not inheritable by anyone else
  public class Foo<U> : FooBase {...generic stuff ...}

  ... nongeneric stuff ...
}

public class Bar<T> where T: FooBase { ... }
...
new Bar<FooBase.Foo<string>>()
公共抽象类FooBase
{
私有FooBase(){}//不可由任何其他人继承
公共类Foo:FooBase{…泛型…}
…非通用的东西。。。
}
公共类栏,其中T:FooBase{…}
...
新酒吧()
希望有帮助,
特洛伊

也许嵌套
时间线
内部
关键帧
在您的设计中是有意义的:

class KeyFrame<T> { 
  public float Time; 
  public T Value; 

  class Timeline<U> where U : Keyframe<T> { 
  } 
} 
类关键帧{
公共浮动时间;
公共价值观;
类时间轴,其中U:关键帧{
} 
} 

您使用的是什么版本的C#。。。永远不要看到时间线在哪里:我的生命线的关键帧是我自己的一类:)我认为,希望与C++中的“模板模板类”类似,所以类时间线{}强制使用关键帧的任何专门化作为时间限制的约束,你至少不做ILIST(或类似的接口)。我只是在做一些一次性代码,C#不是我最熟悉的语言。有可能IList会更好:)是的,这正是我的第一个实现,但它没有像您所说的那样满足我的要求。谢谢:)谢谢你的阅读。我认为FooBase方法非常优雅,从未想过