2016-08-26 1 views
-1

확인했습니다. 아직 요청하지 않았지만 기본 클래스에 메서드가 있습니다. 가상이며 재정의됩니다. 내 파생 된 클래스에서. 질문은기본 클래스 메서드를 재정의하는 방법 해당 메서드의 본문을 자동 채우기

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

에 VS의 방법이 있습니다 - 단 자동 적용

return base.MyMethod(); 

으로 오버라이드 (override) 방법이 기본 방법이다 또는 무엇과 그 방법을 채우는 얻으려면보다는 템플릿을 사용하여 채 웁니까? 내가 ReSharper에서 또는 내장 같은 템플릿을 설정하여이 작업을 수행 할 수 있습니다 알고

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

:

예를 들어

'foreach는'을하지만,이없이 일반적으로 일어날 얻을 수있는 방법이있다 처음부터 템플릿을 만들 필요가 있습니까? 많은 감사.

UPDATE

내 특별한 경우는 (실제로는 이가지 경우에) 내 EF 엔티티 내 기본 MVC 컨트롤러를 무시하고있어 곳입니다. 나는 표현식을 사용하여 필터링을 시도했지만 속도가 너무 느려서 필요한 경우에이 간단한 Where if 절을 추가하면이 Where 절을 추가하는 등의 간단한 작업이 필요하다. 내 파생 클래스는 Entity 타입이 무엇인지 알기 때문에 괜찮습니다. 반면 기본 클래스는 인터페이스 만 알고 있습니다. 내 기본 클래스에서

:

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(); 
     } 

업데이트 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 for me)을 사용할 수 있습니다. 재정의를 생성하고 몸체에 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

방금 ​​제안을 다시 읽었습니다. 미안하지만 당연히 작동합니다. 그러나 실제로 그것이 내가 찾고있는 것이 아닙니다. 내 사과하지만 어쩌면 이것은 시체가 아주 희소하기 때문에 예제로 사용하는 것이 가장 좋은 방법은 아닙니다. –