关于c#:如何在不调用覆盖的情况下从基类中的另一个方法调用基本虚方法?

How do I call a base virtual method from another method in the base class without calling the overrides?

C·VS2010

我的基类中有两个方法。一个是虚拟的,参数列表为空,另一个是重载,该重载不是虚拟的,但允许传入多个参数。

空虚方法在某些派生类中被重写,以改为调用重载的基函数。

重载方法产生传递的值,然后需要调用虚拟方法的基本版本。

我该怎么做?(为了解决这个问题,我将代码从虚拟方法移到了一个单独的私有方法中,这两个方法都调用了该方法,但我想知道是否需要这样做)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
using KVP = KeyValuePair<string, object>;

abstract class BaseRecordClass
{

  private IEnumerable<KVP> BasePrep()
  {
    // Serialization can't handle DbNull.Value so change it to null
    var result = Data.Select(kvp => new KVP(kvp.Key, kvp.Value == DBNull.Value ? null : kvp.Value)).ToList();
    // Add the table name
    result.Add(new KVP(TableNameGuid, TableName));
    return result;  
  }

  /// <summary>
  /// Prepares class for sending/serializing over the web.
  /// </summary>
  /// <returns></returns>
  public virtual IEnumerable<KVP> PrepareForWebInterface()
  {
    return BasePrep();
  }

  /// <summary>
  /// Override to the above that adds extra items to
  /// result eg lists of subrecords
  /// </summary>
  /// <param name="items"></param>
  /// <returns></returns>
  protected IEnumerable<KVP> PrepareForWebInterface(params KVP[] items)
  {
    var result = BasePrep().ToList();
    result.AddRange(items);
    return result;
  }
}// class  

class SubRecordClass
{
  public override IEnumerable<KVP> PrepareForWebInterface()
  {
    var parms = new List<KVP>
    {
      new KVP(CustomGroupsFieldListStr, _customGroupsFieldList.Select(item => item.PrepareForWebInterface()).ToList()),
      new KVP(UserGroupsListStr, _userGroupsList.Select(item => item.PrepareForWebInterface()).ToList()),
      new KVP(StaffPermissionsStr, _staffPermissions.Select(item => item.PrepareForWebInterface()).ToList())
    };
    return PrepareForWebInterface(parms.ToArray());
  }      
}


你的问题不太清楚你想要什么。

听起来您想从同一个类中的继承方法调用一个在子类中被重写的基方法,这个方法不被重写——这有意义吗?

如果是这样,我相信您只需要使用base.YourMethod()调用基类中的方法。

不过,为了简单和清晰起见,您最好将相关逻辑保留在单独的方法中,就像您目前所做的那样。我真的看不出这有什么问题,根据你稀疏的描述。