从静态基类方法调用静态派生类方法

本文关键字:类方法 静态 调用 派生 基类 | 更新日期: 2023-09-27 18:10:34

问题:我有一个实体类(基类),从中继承多次。现在我在所有的派生类中都有一个Add方法和一个Validate方法。这些函数在所有派生类中都是相同的,它们是static

这是我的Add方法

public static long Add(DBData[] UserData)
{
    SortedDictionary<string, DBData> Data = new SortedDictionary<string, DBData>();
    foreach (DBData d in UserData)
    {
        Data.Add(d.FieldName, d);
    }
    if (Project.Validate(Data, OperationMode.Add))
    {
        return DBUtility.Insert("Project", VSCommon.Serialise(Data));
    }
    else
    {
        return -1;
    }
}

现在我在上面的函数中有"Project"(2个地方,一个类型为Project的对象也属于这个函数,另一个是数据库表名)。这是我所有派生类中唯一的不同之处。我想把这个Add方法放在我的基类中,这样我就可以跳过在每个派生类中多次编写它。

我搜索了一下,发现有些人试图使用泛型,但我似乎没有像使用泛型声明时那样选择它。当我调用Validate -方法时,出现了编译错误。此外,我需要类的名称为string,以获得相关的表名。

不确定我能定义我的问题,任何帮助是感激的。谢谢。

从静态基类方法调用静态派生类方法

你可以在基类&virtual)方法,该方法为这个类返回"Project",为其他类返回其他字符串。然后从静态Add方法中引用它。

我认为你也可以使用反射来获得"项目"字符串,如果需要的话。但是我不建议这样做,因为它增加了数据库和代码之间不必要的耦合。

我使用以下ADD函数更改来解决我的问题

public static long Add<T>(DBData[] UserData)
    {
        SortedDictionary<string, DBData> Data = new SortedDictionary<string, DBData>();
        foreach (DBData d in UserData)
        {
            Data.Add(d.FieldName, d);
        }
        MethodInfo m = typeof(T).GetMethod("Validate");
        bool r = (bool)m.Invoke(null, new object[] { Data, OperationMode.Add });
        if (r)
        {
            return DBUtility.Insert(typeof(T).Name, VSCommon.Serialise(Data));
        }
        else
        {
            return -1;
        }
    }

然后我必须将调用更改为Project.Add(…);或Client.Add(…);而不是Project.Add(…)但这最终为我节省了很多麻烦:)。

编辑:我刚刚意识到Project.Add(…)也可以被调用,这将插入到客户端对象。这是不好的,所以我的问题实际上并没有解决:(.