使用抽象类的泛型函数

时间:2018-09-17 11:59:53

标签: c# generics static abstract-class

我正在尝试创建一个静态函数,用另一个函数代替抽象类的实例。 (我简化了代码,将重点放在无法正常工作的地方):

abstract class AbstractData
{
    public int MaxValue;
    public int[] GivenValues;
}

static class AnalyzeData
{
    static void Analyze<T>(int limitValue, AbstractData abstractData) where T : AbstractData
    {
        T.GivenValues = abstractData.GivenValues; //error : T is a type parameter which is not valid in the given context
        T.MaxValue= abstractData.GivenValues[0]; // same error
        foreach (var data in abstractData.GivenValues)
        {
           if (data<limitValue){
               T.MaxValue = data;
           }
        }
        abstractData = T; //same error
    }
}

在函数的定义中,我试图用AbstractData替换T,或者强制转换T,但是没有一个起作用。

我发现的唯一解决方案是使用Abstract Data的另一个实例作为参数(并具有“ in”和“ out”实例):

static void Analyze<T>(int limitValue, AbstractData abstractDataIn, AbstractData abstractDataOut)

但是那样的话,我将失去该函数通用部分的优势。

您知道为什么会出现此错误,以及如何纠正该错误吗?

谢谢!

1 个答案:

答案 0 :(得分:3)

TType,而不是类型的实例。如果要创建并返回新实例,则必须这样写:

static T Analyze<T>(int limitValue, AbstractData abstractData) where T : AbstractData, new()
{
    T t = new T();
    t.GivenValues = abstractData.GivenValues;
    t.MaxValue= abstractData.GivenValues[0];
    foreach (var data in abstractData.GivenValues)
    {
       if (data<limitValue){
           t.MaxValue = data;
       }
    }
    return t;
}

您的返回值为T类型。

另一种选择是传递T的实例:

static void Analyze<T>(int limitValue, AbstractData abstractData, T t) where T : AbstractData
{
    t.GivenValues = abstractData.GivenValues;
    t.MaxValue= abstractData.GivenValues[0];
    foreach (var data in abstractData.GivenValues)
    {
       if (data<limitValue){
           t.MaxValue = data;
       }
    }
}

然后,无需return新创建的实例。