涉及泛型和静态方法的奇怪问题

时间:2010-07-31 04:26:56

标签: c# generics implementation static-methods

我有许多数据类,它们共享一个抽象基类,所以我可以使用它们(有点)。它们每个都有一个名为Lerp的静态方法,我经常使用它和其他几行。我想将这个重构为一个方法,因为DRY,但似乎没有办法这样做。我该如何解决这个问题?

如果需要,可以提供代码。

代码基本上是这样的:

        XmlNode mineDataMin = mineDataMaster.SelectSingleNode("DataMinimum");
        XmlNode mineDataMax = mineDataMaster.SelectSingleNode("DataMaximum");
        _mineTemplate = MineInfo.Lerp(
            new MineInfo(mineDataMin),
            new MineInfo(mineDataMax),
            _strength);

其中类MineInfo可以是几个类之一,它们共享一个抽象类,用于一般地处理它们中的任何一个。 Lerp是一种静态方法,它是麻烦的源头。

1 个答案:

答案 0 :(得分:2)

您可以使用委派来实现Lerp()功能。如果它们都共享相同的签名,那将是最简单的。

如,

public static Template CreateTemplate<T>( ... , Func<T, T, int, Template> lerp)
    where T : CommonClass
{
    XmlNode mineDataMin = mineDataMaster.SelectSingleNode("DataMinimum");
    XmlNode mineDataMax = mineDataMaster.SelectSingleNode("DataMaximum");
    return lerp(new T(mineDataMin), new T(mineDataMax), _strength);
}

_template = CreateTemplate( ... , MineInfo.Lerp);

或者,如果他们没有共同的签名,请使用具有“最大公分母”的委托作为签名来调用实际的lerp函数。

_template = CreateTemplate( ... ,
    (min, max, strength) =>
    {
        return SomeOtherInfoInfo.Lerp(min, max); //doesn't use strength
    });

否则总会有反思。