【发布时间】:2016-11-21 12:01:30
【问题描述】:
我有如下界面
public interface IQueryBuilder
{
SqlCommand Build(IReportDataSource dataSource, List<IReportColumn> columns, List<IReportRelationMapping> relationMappings, IReportFilterMapping filters, List<IReportColumn> columsToSortBy, ReportFormat reportFormat);
string GetSqlClause(List<IReportFilter> reportFilters, ref List<IDataParameter> sqlParams);
}
但是,我希望能够直接访问实现中的方法GetSqlClause。
这是我实现上述的方法
public class QueryBuilder : IQueryBuilder
{
public SqlCommand Build(IReportDataSource dataSource, List<IReportColumn> columns, List<IReportRelationMapping> relationMappings, IReportFilterMapping filters, List<IReportColumn> columsToSortBy, ReportFormat reportType)
{
//Do something awsome!!!
string sqlQuery = "";
List<IDataParameter> sqlParameters = new List<IDataParameter>();
return this.GetSqlCommand(sqlQuery, sqlParameters);
}
private SqlCommand GetSqlCommand(string sqlQuery, List<IDataParameter> sqlParams)
{
var command = new SqlCommand(sqlQuery);
foreach (IDataParameter dataParameter in sqlParams)
{
command.Parameters.Add(dataParameter);
}
return command;
}
public static string GetSqlClause(List<IReportFilter> reportFilters, ref List<IDataParameter> sqlParams)
{
string sqlFilter = "";
if (reportFilters != null && reportFilters.Any())
{
//At this point we know there are some filter to add to the list
var firstFilter = reportFilters.First();
foreach (var reportFilter in reportFilters)
{
var parameter = GenerateDbParameter("p" + sqlParams.Count, reportFilter.FormattedValue, SqlDbType.NVarChar);
....
....
}
}
return sqlFilter;
}
private static IDataParameter GenerateDbParameter(string parameterName, object parameterValue, SqlDbType parameterType)
{
if (string.IsNullOrEmpty(parameterName) || parameterValue == null)
{
throw new ArgumentException();
}
var parameter = new SqlParameter("@" + parameterName, parameterType)
{
Value = parameterValue
};
return parameter;
}
}
因为我在我的 GetSqlClause 方法上使用了 static,所以我收到了一个错误
无法实现接口成员,因为它是静态的。
有什么好的方法可以解决这个问题?如何直接访问我的GetSqlClause?
【问题讨论】:
-
您希望它是静态的有什么原因吗?有必要吗?只是不要让它成为静态的。
-
在
interface中拥有static成员是没有意义的。为什么不能使用QueryBuilder.GetSqlClause而不是IQueryBuilder.GetSqlClause -
旁注:将
System.List<IDataParameter>作为ref参数传递是一个糟糕的设计。定期传递,甚至更好,如IList<IDataParameter>。 -
@Jaylen,我曾经想知道这一点。我的问题是我不理解接口的意义。您应该阅读测试驱动设计和依赖注入。
标签: c#