コードを生成するユーティリティを使用します。私はそれを拡張したいと思って、私はコードジェネレータに戻ることなくそれを行うことができるかもしれないと思った。ここに問題があります。ベースでプロテクトメソッドを呼び出す派生クラスに拡張メソッドを追加できますか?
コードジェネレータは、私を与える:
public abstract class BaseService
{
protected virtual SqlCommand CreateSelectCommand(string whereClause, Hashtable parameters, string orderClause, int maxRows);
protected DataSet Fill(SqlCommand command);
}
そして、それは、このクラスを実装するクラスの多くを生成します。例えば
public class ChildService : BaseService
{
protected override SqlCommand CreateSelectCommand(string whereClause, Hashtable parameters, string orderClause, int maxRows)
{
//implementation here
}
protected override SqlCommand CreateSelectCommand(string whereClause, Hashtable parameters, string orderClause, int maxRows)
{
//implementation here
}
public virtual DataSet Select(string whereClause, System.Collections.Hashtable parameters, string orderClause, int maxRows)
{
SqlCommand command = CreateSelectCommand(whereClause, parameters, orderClause, maxRows);
return Fill(command);
}
}
ここで、すべての子クラスを拡張して、Selectメソッドをオーバーライドしたいと考えています。私はこのような拡張メソッドの何かを試してみました:
public DataSet Select(this BaseService service, string whereClause, Hashtable parameters, string orderBy, int startRowIndex, int maximumRows)
{
SqlCommand command = service.CreateSelectCommand(whereClause, parameters, orderClause, maxRows);
//Modify the command here
return service.Fill(command);
}
をしかし、サービスパラメータは、子クラスのインスタンスではありませんので、メソッドを保護CreateSelectCommandにアクセスして記入することができないので、コンパイラは文句を言います。 これを回避する方法はありますか?私はこれをすべての子クラスに実装する必要はありませんか?
拡張メソッドの代わりに生成された基本クラスにメソッドを追加するために部分クラスを使用しない理由はありますか? –
いいアイデアですが、すべての部分で部分的なキーワードを使用する必要があるため – Colin