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

时间:2016-08-26 15:24:24

标签: c# templates methods override base-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或通过设置内置的模板来做到这一点:&#39; foreach&#39;,但有没有办法让这种情况一般发生而无需在第一名? 非常感谢。

更新

我的特殊情况(实际上这是两个案例)是我为我的EF实体覆盖我的基础MVC控制器的地方。 我尝试过使用表达式进行过滤,但是它太慢了所以我在需要它的时候回复 - 如果这样,那么就添加这个Where子句,如果然后添加这个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();
        }

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

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

2 个答案:

答案 0 :(得分:0)

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

基类:

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

答案 1 :(得分:0)

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

要通过手动方式快速完成,您可以使用“Peek Definition”(Alt + F12代表我)。创建覆盖并让它用base.XXX位填充正文后,将光标放在'XXX'部分并查看定义。这将弹出一个窥视窗口,您可以轻松地复制基础实现。