2016-08-26 5 views
-1

これは既に確認されていますが、これはまだ尋ねられていませんが、私の基本クラスにはメソッドがあります。それは私の派生クラスです。質問がある基本クラスのメソッドをオーバーライドする方法は、そのメソッドの本体を自動入力する

public MyBaseClass() 
    { 
     public virtual void MyBaseMethod() 
     { 
      return a + b; 
     } 
    } 

、とVSでの方法があります - ちょうど自動投入

return base.MyMethod(); 

でオーバーライドされたメソッドは、それが基本法にだか何とその方法を移入するために取得するのではなくそれをテンプレートを使用して作成しますか?例えば

public MyDerivedClass() 
{ 
    public override void MyBaseMethod() 
    { 
     return a + b; <-- Auto-generated from body of base method 
    } 
} 

私はResharperのまたは組み込みのようなテンプレート設定することによってこれを行うことができます知っている:「foreachの」が、これはなくて一般的に起こることを取得する方法があります最初にテンプレートを作成する必要がありますか? 多くのありがとうございます。私は私のEFエンティティのための私のベースMVCコントローラをオーバーライドよどこ

UPDATE

私の特定の場合には、(実際には、これが2例である)です。 私は式をフィルタリングに使用しようとしましたが、速度があまりにも遅いため、必要に応じて、このWhere句を追加するとシンプルになりました。なぜなら、私の派生クラスはエンティティタイプが何であるかを知っているのに対し、私の基本クラスはそれをインターフェースからしか知りません。私の基本クラスで

:私の派生クラスで

public virtual IQueryable<T> onBeforeFinalSelect(IQueryable<T> results) 
     { 
      return results; 
     } 

public override IQueryable<PostcodePrefixRatingMAP> onBeforeFinalSelect(IQueryable<PostcodePrefixRatingMAP> results) 
     { 
      return results 
       .Include(x => x.PostcodePrefix).AsNoTracking() 
       .Include(x => x.Rating.RatingType).AsNoTracking() 
       .Include(x => x.Rating).AsNoTracking(); 
     } 

UPDATE 2!

これを想像してみてください。私の派生クラスでは、私の基本メソッドをオーバーライドしています - これは本当に私が狙っているものです - 私はそれを必要とします - あらかじめ定義されたテンプレートでボディを埋めるためにオーバーライドされます。例えば

、 私の基本クラス:

public virtual IQueryable<T> GetFilterWhereClause(IQueryable<T> results) 
     { 
      return results; 
     } 

私の派生クラス:今、これが唯一のいくつかのエンティティのために必要とされる

public override IQueryable<PostcodePrefixRatingMAP> GetFilterWhereClause(IQueryable<PostcodePrefixRatingMAP> results) 
     { 
      foreach (var item in this.DataFiltering.Filters) 
      { 
       var _intValue = 0; 
       switch (item.PropertyName) 
       { 
        case "Rating.RatingTypeId": 
         _intValue = item.Value.ToString().ToInt(); 
         results = results.Where(x => x.Rating.RatingTypeId == _intValue); 
         break; 
        case "Rating.Description": 
         results = results.Where(x => x.Rating.Description == item.Value.ToString()); 
         break; 
        default: 
         break; 
       } 
      } 
      return results; 
     } 

、私の全体的な実体の小さな割合。あなたの特定のケースで

+0

あなたのコードで基本クラスのコードを複製する必要があるのはなぜですか?これが 'base.MyMethod()'の目的です。私は利益が表示されません – Jonesopolis

+0

派生クラスでそれを少し変更したい場合もありますが、Genericsで克服できるものではありません。私はユースケースで質問を更新します。 –

+0

@Jonesopolis私は質問を更新しました。 –

答えて

0

私は答えが「いいえ」だと思います。 Visual Studioは、オーバーライドされたメソッド本体を自動的にコピーする方法を提供しません。

手動で比較的早く行うには、「Peek Definition」(私にとってはAlt + F12)を使用します。オーバーライドを作成してボディにbase.XXXビットで塗りつぶした後、カーソルを 'XXX'部分に置き、定義を覗きます。これにより、ベース実装を簡単にコピーできるピークウィンドウがポップアップします。

+0

ありがとうございます。これは、基本メソッドが派生したメソッドに必要なものと同様のコードを含んでいる場合に役立ちますが、テンプレートを取り込むことについてはまだ失われています。 –

0

あなただけのベース・メソッド呼び出しにこれらのものを追加することができます。

基本クラス:

public virtual IQueryable<T> onBeforeFinalSelect(IQueryable<T> results) 
{ 
    return results; 
} 

派生クラス:

public override IQueryable<PostcodePrefixRatingMAP> onBeforeFinalSelect(IQueryable<PostcodePrefixRatingMAP> results) 
{ 
    return base.onBeforeFinalSelect(results) 
     .Include(x => x.PostcodePrefix).AsNoTracking() 
     .Include(x => x.Rating.RatingType).AsNoTracking() 
     .Include(x => x.Rating).AsNoTracking(); 
} 

この作品あなたのために」返信するIQueryable

+0

基本クラスがPostcodePrefixRatingMAPのすべてのプロパティを認識しないため、これは機能しません。基本クラスのインタフェース継承に従う共通のプロパティだけがわかります。 –

+0

基本クラスはそれらについて知る必要はなく、依然としてそれが知っていることを返すことができます。派生クラスでは、私の例のように、他のメソッドをタックすることができます。あなたはそれを試しましたか? – Kenneth

+0

私はちょうどあなたの提案を再読しました、ごめんなさい、それはもちろん仕事です。しかし実際それは私が探しているものではありません。私の謝罪ですが、体が非常に希薄であるため、これは例として使用するのに最良の方法ではないかもしれません。 –

関連する問題