如何覆盖基础 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 您可以轻松地从中复制基本实现。
我已经检查过,我确定还没有人问过这个问题,但我的基础 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 您可以轻松地从中复制基本实现。