C# 如何重写基类方法但自动填充该方法的主体
我已经检查过了,我确信这还没有被问到,但我在基类中有一个方法,它是虚拟的,我在派生类中重写了它C# 如何重写基类方法但自动填充该方法的主体,c#,templates,methods,overriding,base-class,C#,Templates,Methods,Overriding,Base Class,我已经检查过了,我确信这还没有被问到,但我在基类中有一个方法,它是虚拟的,我在派生类中重写了它 public MyBaseClass() { public virtual void MyBaseMethod() { return a + b; } } 问题是,在VS to中是否有一种方法,而不仅仅是用 return base.MyMethod(); 让它用基本方法中的内容填充该方法,或者使用模板填充
public MyBaseClass()
{
public virtual void MyBaseMethod()
{
return a + b;
}
}
问题是,在VS to中是否有一种方法,而不仅仅是用
return base.MyMethod();
让它用基本方法中的内容填充该方法,或者使用模板填充它
例如:
public MyDerivedClass()
{
public override void MyBaseMethod()
{
return a + b; <-- Auto-generated from body of base method
}
}
公共MyDerivedClass()
{
公共重写无效MyBaseMethod()
{
返回a+b;x.PostcodePrefix).AsNoTracking()
.Include(x=>x.Rating.RatingType).AsNoTracking()
.Include(x=>x.Rating).AsNoTracking();
}
更新2!
好的,想象一下,在我的派生类中,它重写了我的基方法——这就是我想要的——当被重写以用预定义模板填充主体时
比如说,,
我的基类:
public virtual IQueryable<T> onBeforeFinalSelect(IQueryable<T> results)
{
return results;
}
public virtual IQueryable<T> GetFilterWhereClause(IQueryable<T> results)
{
return results;
}
public virtual IQueryable<T> onBeforeFinalSelect(IQueryable<T> results)
{
return results;
}
公共虚拟IQueryable GetFilterWhere子句(IQueryable结果)
{
返回结果;
}
我的派生类:
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();
}
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;
}
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();
}
public覆盖IQueryable getFilterWhere子句(IQueryable结果)
{
foreach(this.DataFiltering.Filters中的var项)
{
var _intValue=0;
开关(item.PropertyName)
{
案例“Rating.RatingTypeId”:
_intValue=item.Value.ToString().ToInt();
结果=结果。其中(x=>x.Rating.RatingTypeId==\u intValue);
打破
案例“评级说明”:
results=results.Where(x=>x.Rating.Description==item.Value.ToString());
打破
违约:
打破
}
}
返回结果;
}
现在,这只对某些实体是必需的,只占我整个实体的一小部分。在您的特定情况下,您可以将这些内容添加到基本方法调用中: 基类:
public virtual IQueryable<T> onBeforeFinalSelect(IQueryable<T> results)
{
return results;
}
public virtual IQueryable<T> GetFilterWhereClause(IQueryable<T> results)
{
return results;
}
public virtual IQueryable<T> onBeforeFinalSelect(IQueryable<T> results)
{
return results;
}
public虚拟IQueryable onBeforeFinalSelect(IQueryable结果)
{
返回结果;
}
派生类:
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();
}
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;
}
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();
}
public override IQueryable onBeforeFinalSelect(IQueryable结果)
{
return base.onBeforeFinalSelect(结果)
.Include(x=>x.PostcodePrefix).AsNoTracking()
.Include(x=>x.Rating.RatingType).AsNoTracking()
.Include(x=>x.Rating).AsNoTracking();
}
这是可行的,因为您返回的是IQueryable
我认为答案是“否”。Visual Studio不提供自动复制重写方法体的方法
要通过手动方式相对快速地完成,您可以使用“Peek定义”(我使用Alt+F12)。在创建重写并让它用
base.XXX
位填充正文后,将光标放在“XXX”部分并查看定义。这将弹出一个查看窗口,您可以轻松地从中复制基本实现。我很好奇为什么您希望您的代码复制基类的代码?这就是base.MyMethod()
是为。在某些情况下,我可能不想在派生类中对其稍作修改,但这不是泛型可以克服的。我将用我的用例更新我的问题。@Jonesopolis我已经更新了问题。这不起作用,因为基类不知道PostcodePrefixRatingMAP的所有属性ies。它只根据基类中的接口继承知道它的公共属性。基类不需要知道它们,它仍然可以返回它知道的东西。在派生类中,您可以附加任何其他方法(如我的示例中).你试过了吗?我刚刚重新阅读了你的建议,很抱歉,这当然有效。但事实上,这并不是我想要的。我很抱歉,但这可能不是用作示例的最佳方法,因为它的主体非常稀疏。谢谢。当基方法包含类似于我在派生方法中需要的代码时,这会有所帮助,但我仍然不知道如何填充模板。