使用抽象类的通用函数

问题描述 投票:0回答:1

我试图创建一个静态函数替换另一个抽象类的实例。 (我简化了代码,专注于它不起作用的地方):

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)

但是后来我将失去函数通用部分的优势。

你知道为什么我有这个错误,我怎么能纠正它?

谢谢 !

c# generics static abstract-class
1个回答
3
投票

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

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新创建的实例了。

© www.soinside.com 2019 - 2024. All rights reserved.