Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何重写基类方法但自动填充该方法的主体_C#_Templates_Methods_Overriding_Base Class - Fatal编程技术网

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。它只根据基类中的接口继承知道它的公共属性。基类不需要知道它们,它仍然可以返回它知道的东西。在派生类中,您可以附加任何其他方法(如我的示例中).你试过了吗?我刚刚重新阅读了你的建议,很抱歉,这当然有效。但事实上,这并不是我想要的。我很抱歉,但这可能不是用作示例的最佳方法,因为它的主体非常稀疏。谢谢。当基方法包含类似于我在派生方法中需要的代码时,这会有所帮助,但我仍然不知道如何填充模板。