C# 在c中实现接口时,如何创建公共静态方法?

C# 在c中实现接口时,如何创建公共静态方法?,c#,C#,我有以下接口 public interface IQueryBuilder { SqlCommand Build(IReportDataSource dataSource, List<IReportColumn> columns, List<IReportRelationMapping> relationMappings, IReportFilterMapping filters, List<IReportColumn> columsToSortBy,

我有以下接口

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方法上使用static,所以出现了一个错误

无法实现接口成员,因为它是静态的


解决这个问题的好办法是什么?如何直接访问我的GetSqlClause?

如果您希望方法是静态的并实现一个接口,该语言不允许您这样做,但您可以通过以下几种方式解决此问题:

如果从静态上下文访问整个实现是有意义的,您可以简单地声明一个单例对象:

public static QueryBuilder Instance { get; } = new QueryBuilder();
现在您可以访问QueryBuilder.Instance静态属性,其值实现IQueryBuilder

通过显式方法实现。这是实现接口方法的附加实例方法,其签名不会与类中的另一个方法冲突

string IQueryBuilder.GetSqlClause(List<IReportFilter> reportFilters, ref List<IDataParameter> sqlParams)
{
    // Call the static method, this is *not* a recursive call
    return GetSqlClause(reportFilters, ref sqlParams);
}
另一个更简单的解决方案是使用两个不同的方法名


C不支持实现接口方法的静态成员。

您希望它是静态的原因是什么?需要吗?只是不要让它是静态的。在接口中有静态成员是没有意义的。为什么不能使用QueryBuilder.GetSqlClause而不是IQueryBuilder.GetSqlClauseSide注意:将System.List作为ref参数传递是一种糟糕的设计。“定期传递,或者更好,就像IList一样。”杰伦,我曾经想知道这一点。我的问题是我不理解接口的意义。你应该仔细阅读测试驱动设计和依赖注入;它不是静态的。@Servy是的,实例方法调用静态方法。这回答了我理解的问题。@Servy我重写了答案,希望能让我的观点更清楚,现在好点了吗?尽管设计可能有问题,但在某些情况下,它可能被证明是有用的。这是正确的,但StackOverflow不是一个琐碎的游戏。接口中的静态成员甚至没有意义,但从您的回答来看,OP可能认为它只是不受支持
string IQueryBuilder.GetSqlClause(List<IReportFilter> reportFilters, ref List<IDataParameter> sqlParams)
{
    // Call the static method, this is *not* a recursive call
    return GetSqlClause(reportFilters, ref sqlParams);
}
ReturnType InterfaceName.MethodName(ParamType param)
{
    ...
}