2012-03-30 6 views
1

コードを生成するユーティリティを使用します。私はそれを拡張したいと思って、私はコードジェネレータに戻ることなくそれを行うことができるかもしれないと思った。ここに問題があります。ベースでプロテクトメソッドを呼び出す派生クラスに拡張メソッドを追加できますか?

コードジェネレータは、私を与える:

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にアクセスして記入することができないので、コンパイラは文句を言います。 これを回避する方法はありますか?私はこれをすべての子クラスに実装する必要はありませんか?

+0

拡張メソッドの代わりに生成された基本クラスにメソッドを追加するために部分クラスを使用しない理由はありますか? –

+0

いいアイデアですが、すべての部分で部分的なキーワードを使用する必要があるため – Colin

答えて

6

これを回避する方法はありますか。すべての子クラスでこれを実装する必要はありませんか?

いいえ、ありません。

拡張メソッドは、唯一のタイプに「所属」する(インテリセンスの魔法によって)表示され静的クラスの静的メソッドです。これは、種類がと一致する必要があります(正確には)。

ではなく、は型に属し、その型で宣言されている保護された/非公開のメンバーにはアクセスできません。

3

いいえ。拡張メソッドは、動作するクラスの外部にあります。保護されたメソッドにアクセスできるのは、クラス自体(またはネストされた内部クラス)、またはそれを継承する別のクラスだけです。

ところで、あなたはまったく拡張メソッドを使用してオーバーライドを提供していない...

1

号拡張メソッドは、静的メソッド呼び出しの構文糖です。アクセシビリティの観点からは、拡張メソッドのルールは静的メソッドのルールとまったく同じです。静的メソッドはprotectedなどのアイテムに違反することはできず、したがって拡張メソッドも使用できません