我该怎么做?
情景:
abstract class DataAccess
{
public abstract string ConnectionString { get; set; }
public static DataTable ExecuteSql(string sql)
{
// ...
}
public static object ExecuteStoredProc(string storedProcName, ...)
{
// ...
}
}
abstract class DataAccessDb1 : DataAccess
{
public override string ConnectionString = "SetDbSpecificConnectionStringHere";
public static DataTable GetStuff()
{
// Call the method with the ConnectionString set HERE.
return ExecuteSql("select * from stuff");
}
}
我知道可以像在派生类中一样设置连接字符串,但是我想保持静态,因此我不会在派生类的每个方法中设置属性......任何想法?
答案 0 :(得分:2)
是:将连接字符串作为参数传递给方法。
DataAccessDb1
中的声明无效static
和多态不混合所以基本上,如果你想要多态行为,你应该使用实例成员。如果您不需要多态行为,请将任何变体(例如连接字符串)作为方法的参数传递。
答案 1 :(得分:0)
C#中没有静态继承,因此让ConnectionString
拥有静态成员并覆盖它的目标将无效。重新考虑你的设计 - 让ConnectionString
为静态真的说这个字段在所有DataAccess
个实例上应该是相同的,因为它是在类型本身上定义的。
使用静态方法是否有特殊原因 - 使用实例方法并在构造函数中设置连接字符串将起作用:
public class DataAccessDb1
{
public string ConnectionString {get;set;}
public DataAccessDb1()
{
ConnectionString = "SetDbSpecificConnectionStringHere";
}
public void DataTable GetStuff()
{
return DataAccess.ExecuteSql(ConnectionString, "select * from stuff");
}
}
答案 2 :(得分:0)
我认为你应该只在抽象类中有一个ExecuteSql方法,所有派生类都会用它们各自的连接字符串实现ExecuteSql,
public abstarct string ConnectionString{get;set;}
可以从基类中删除。