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方法非常优雅,从未想过