允许列表中的所有类型的泛型类型

时间:2016-07-15 03:34:34

标签: c# generics

我在使用泛型方面遇到了一些问题。我有一个名为Animation的基类,不同类型的动画源自(例如double,vector等),并处理所有动画我使用静态类来管理所有动画。

public class Animation<T>
{

    public virtual Action<T> UpdateAction { get; set; }
    public EasingFunctionBase EasingFunction { get; set; }

    private TimeSpan _Duration = TimeSpan.FromMilliseconds(0);
    public TimeSpan Duration { get; set; }


    public T currentValue { get; internal set; }


    internal TimeSpan CurrentTime = TimeSpan.FromMilliseconds(0);
    internal double Percentage = 0;
    internal bool HasFinished = false;

    internal virtual void Update()
    {
        UpdateAction?.Invoke(CurrentValue);
    }


    public virtual void BeginAnimation()
    {
        if (Duration.TotalMilliseconds <= 0)
            throw new InvalidOperationException("You need a duration greater than 0 seconds.");

        AnimationFactory.BeginAnimation(this);
    }
}

DoubleAnimation : Animation<double>
{
    *do some calculations and set currentValue*
}

public static class AnimationFactory
{

    private static List<Animation> _CurrentAnimations = new List<Animation>();

    public static void BeginAnimation<T>(Animation<T> animation)
    {
        // Here is where I'm getting the error. I want this list to be able to contain all types of Animation<T>.
        _CurrentAnimations.Add(animation);

        _isEnabled = true;
    }
    void Update()
    {
        for(int i = 0; i < _CurrentAnimations.Count; i++)
        {
            _CurrentAnimations[i].update();
        }
    }
}

正如您所看到的,我收到一个错误,我想将新创建的和要运行的动画添加到列表中。如何使此列表接受Animation<T>各种?或者我错了吗?我添加了泛型类型以删除强制转换(如果是动画结构),但也许这是一个更智能的解决方案。

1 个答案:

答案 0 :(得分:2)

  

如何让这个列表接受各种动画?

除非AnimationAnimation<T>的基类,否则你不能。 什么是Animation?它与Animation<T> 的关系是什么?根据您的其他信息,您似乎还没有Animation课程。

一种替代方案是使静态类也是通用的,例如AnimationFactory<T>。然后列表将是List<Animation<T>>。但是,对于每个类型参数T,您会有一个不同的列表,这看起来不像您正在寻找的那样。

根据目前为止的信息,我会说你应该Animation<T>继承Animation或其他一些合适的基类(使用该基类作为List<T>的类型参数) 。在这个特定的例子中,这将需要创建Animation基类,因为它实际上并不存在。

除此之外,您的问题可能是XY Problem。即你问过我们错误的问题,而且应该把重点放在你真正试图解决的更广泛的问题上,而不是列表中的细节方面。