如何覆盖基础 class 方法但自动填充该方法的主体

How To Override a base class Method But Auto-Populate The Body Of That Method

我已经检查过,我确定还没有人问过这个问题,但我的基础 class 中有一个方法,它是虚拟的,我在派生的 class 中覆盖了它。

    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 控制器。 我已经尝试使用表达式进行过滤,但它太慢了所以我恢复到 - 在需要它的情况下 - 一个简单的 if this 然后添加这个 Where 子句,如果那个然后添加这个 Where 子句等但是没关系因为我的派生 classes 知道实体类型是什么,而我的基础 class 只从它的接口知道它。

在我的基地class:

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

在我导出的class:

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!

好吧想象一下。在我的派生 class 中,它覆盖了我的基本方法 - 这确实是我想要的 - 我想要它 - 当被覆盖以使用预定义模板填充正文时。

例如, 我的基地 class:

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

我的派生class:

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

现在这只对某些实体是必需的,占我所有实体的一小部分。

在您的特定情况下,您可以将这些内容添加到基本方法调用中:

基础class:

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

派生 class:

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

我认为答案是"no"。 Visual Studio 不提供自动复制重写方法体的方法。

要通过手动方式相对快速地完成此操作,您可以使用 "Peek Definition"(对我来说是 Alt+F12)。创建覆盖并让它用 base.XXX 位填充正文后,将光标放在 'XXX' 部分并查看定义。这将弹出一个预览 window 您可以轻松地从中复制基本实现。