问题:我有一个实体类(基类),我从中继承了多次。现在我在所有派生类中都有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
来获取相关的表名。
不确定我是否能够定义我的问题,任何帮助都表示赞赏。感谢。
答案 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对象中。这不好,所以我的问题实际上没有解决:(。