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

时间:2013-04-24 08:23:18

标签: c#

问题:我有一个实体类(基类),我从中继承了多次。现在我在所有派生类中都有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来获取相关的表名。

不确定我是否能够定义我的问题,任何帮助都表示赞赏。感谢。

2 个答案:

答案 0 :(得分:0)

您可以添加(基类和虚拟中的抽象)方法,该方法为此类返回“Project”,为其他类添加其他字符串。然后从静态Add方法中引用它。

我认为如果需要,你也可以使用reflecion获取“Project”字符串。但是我建议不要这样做,因为它会在数据库和代码之间增加不必要的耦合。

答案 1 :(得分:0)

我使用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&lt; Project&gt;(...);或Client.Add&lt;客户&gt;(...);而不是Project.Add(...)之前。但这最终为我省去了很多麻烦:)。

编辑:我只是意识到Project.Add&lt; Client&gt;(...)也可以被调用,这将插入到Client对象中。这不好,所以我的问题实际上没有解决:(。