-1

问题:我有一个实体类(基类),我从中继承了多次。现在我在所有派生类中都有一个Add-method 和一个-method。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-method 时出现编译错误。另外,我需要类的名称string来获取相关的表名。

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

4

2 回答 2

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

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

于 2013-04-24T09:13:15.683 回答
0

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

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

于 2013-04-24T08:34:44.267 回答