如何在 C# 中从派生类实例调用基方法?

2024-03-22

我有 C# 代码,基础class A并得出class B:

public class A
{
    public virtual void print() {Console.WriteLine("a"); }
}
public class B:A
{
    public override void print() { Console.WriteLine("b"); }
}

static void Main(string[] args)
{
    A a= new B();
    //In c++ I can use .Base:: to call base method from derived class instance
    a.Base::print();
}

我无法修改这两个类,而且我不知道在 C# 中可以做什么,有什么建议吗?


此外,感谢大家参与这次讨论,我想澄清为什么我需要这种行为:

在.net框架中,我们有一个接口IPostBack数据处理程序处理回发。里面有一个方法

public bool LoadPostData( string postDataKey, NameValueCollection postCollection )

当我实现它并测试时,我有时发现给定的回发类型收藏后 is 名称值集合,而其他时间则是Http值集合(派生类名称值集合)

那么,如果它是一种类型Http值集合,当我从中获取物品时,例如。postCollection['ControlID']我输入html在这个控制中,HttpValueCollection.get_item()将始终验证输入并将其视为缺陷。尽管NameValueCollection.get_item() won't

至少我不希望它自动进行验证I应该决定是否应该验证它,应该吗?


无法从派生类外部访问基方法。 您可以在派生类中编写一个方法来调用基方法,如下所示:

public class B : A
{
    public override void print() { Console.WriteLine("B"); }

    public void basePrint() { base.print(); }
}

或者您可以使用Reflection获取基本方法定义并调用它,但它相当难看。 以下是创建方法DynamicMethod调用基地print method:

// Get MethodInfo of the base method
var methodInfo = typeof(A).GetMethod("Print", BindingFlags.Instance | BindingFlags.Public);

// Create DynamicMethod based on the methodInfo
var dynamicMethod = new DynamicMethod("BasePrint", methodInfo.ReturnType, new[] { methodInfo.DeclaringType }, methodInfo.DeclaringType);
// Create ILGenerator for the dynamic method
var il = dynamicMethod.GetILGenerator();

// Emit argument with index 0 - DeclaringType
il.Emit(OpCodes.Ldarg_0);
// Emit method call
il.EmitCall(OpCodes.Call, methodInfo, null);
// Emit method return value
il.Emit(OpCodes.Ret);

// Invoke method with target...
var b = new B();
dynamicMethod.Invoke(null, new object[] {b});

// ... or create a delegate and invoke method without target
var action = dynamicMethod.CreateDelegate(typeof(Action)) as Action;
action.Invoke();

注意它仅适用于无参数方法。如果你想调用带有参数的方法,你必须将它们的类型放入数组中DeclaringType然后将它们全部发出。此外,您还必须创建类型的委托Action<parameterTypes or Func<returnType, parameterTypes>如果该方法返回一些东西。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何在 C# 中从派生类实例调用基方法? 的相关文章

  • GLKit的GLKMatrix“列专业”如何?

    前提A 当谈论线性存储器中的 列主 矩阵时 列被一个接一个地指定 使得存储器中的前 4 个条目对应于矩阵中的第一列 另一方面 行主 矩阵被理解为依次指定行 以便内存中的前 4 个条目指定矩阵的第一行 A GLKMatrix4看起来像这样 u
  • 动态加载程序集的应用程序配置

    我正在尝试将模块动态加载到我的应用程序中 但我想为每个模块指定单独的 app config 文件 假设我的主应用程序有以下 app config 设置
  • 在结构中使用 typedef 枚举并避免类型混合警告

    我正在使用 C99 我的编译器是 IAR Embedded workbench 但我认为这个问题对于其他一些编译器也有效 我有一个 typedef 枚举 其中包含一些项目 并且我向该新类型的结构添加了一个元素 typedef enum fo
  • 不支持将数据直接绑定到存储查询(DbSet、DbQuery、DbSqlQuery)

    正在编码视觉工作室2012并使用实体模型作为我的数据层 但是 当页面尝试加载时 上面提到的标题 我使用 Linq 语句的下拉控件往往会引发未处理的异常 下面是我的代码 using AdventureWorksEntities dw new
  • 查找c中结构元素的偏移量

    struct a struct b int i float j x struct c int k float l y z 谁能解释一下如何找到偏移量int k这样我们就可以找到地址int i Use offsetof 找到从开始处的偏移量z
  • 使用实体框架模型输入安全密钥

    这是我今天的完美想法 Entity Framework 中的强类型 ID 动机 比较 ModelTypeA ID 和 ModelTypeB ID 总是 至少几乎 错误 为什么编译时不处理它 如果您使用每个请求示例 DbContext 那么很
  • 类模板参数推导 - clang 和 gcc 不同

    下面的代码使用 gcc 编译 但不使用 clang 编译 https godbolt org z ttqGuL template
  • BitTorrent 追踪器宣布问题

    我花了一点业余时间编写 BitTorrent 客户端 主要是出于好奇 但部分是出于提高我的 C 技能的愿望 我一直在使用理论维基 http wiki theory org BitTorrentSpecification作为我的向导 我已经建
  • HTTPWebResponse 响应字符串被截断

    应用程序正在与 REST 服务通信 Fiddler 显示作为 Apps 响应传入的完整良好 XML 响应 该应用程序位于法属波利尼西亚 在新西兰也有一个相同的副本 因此主要嫌疑人似乎在编码 但我们已经检查过 但空手而归 查看流读取器的输出字
  • 在 ASP.NET 5 中使用 DI 调用构造函数时解决依赖关系

    Web 上似乎充斥着如何在 ASP NET 5 中使用 DI 的示例 但没有一个示例显示如何调用构造函数并解决依赖关系 以下只是众多案例之一 http social technet microsoft com wiki contents a
  • 重载<<的返回值

    include
  • 转发声明和包含

    在使用库时 无论是我自己的还是外部的 都有很多带有前向声明的类 根据情况 相同的类也包含在内 当我使用某个类时 我需要知道该类使用的某些对象是前向声明的还是 include d 原因是我想知道是否应该包含两个标题还是只包含一个标题 现在我知
  • 控件的命名约定[重复]

    这个问题在这里已经有答案了 Microsoft 在其网站上提供了命名指南 here http msdn microsoft com en us library xzf533w0 VS 71 aspx 我还有 框架设计指南 一书 我找不到有关
  • cmake 将标头包含到每个源文件中

    其实我有一个简单的问题 但找不到答案 也许你可以给我指一个副本 所以 问题是 是否可以告诉 cmake 指示编译器在每个源文件的开头自动包含一些头文件 这样就不需要放置 include foo h 了 谢谢 CMake 没有针对此特定用例的
  • C# 成员变量继承

    我对 C 有点陌生 但我在编程方面有相当广泛的背景 我想做的事情 为游戏定义不同的 MapTiles 我已经像这样定义了 MapTile 基类 public class MapTile public Texture2D texture pu
  • C# 模拟VolumeMute按下

    我得到以下代码来模拟音量静音按键 DllImport coredll dll SetLastError true static extern void keybd event byte bVk byte bScan int dwFlags
  • 哪种 C 数据类型可以表示 40 位二进制数?

    我需要表示一个40位的二进制数 应该使用哪种 C 数据类型来处理这个问题 如果您使用的是 C99 或 C11 兼容编译器 则使用int least64 t以获得最大的兼容性 或者 如果您想要无符号类型 uint least64 t 这些都定
  • 如何将服务器服务连接到 Dynamics Online

    我正在修改内部管理应用程序以连接到我们的在线托管 Dynamics 2016 实例 根据一些在线教程 我一直在使用OrganizationServiceProxy out of Microsoft Xrm Sdk Client来自 SDK
  • Python 类继承 - 诡异的动作

    我观察到类继承有一个奇怪的效果 对于我正在处理的项目 我正在创建一个类来充当另一个模块的类的包装器 我正在使用第 3 方 aeidon 模块 用于操作字幕文件 但问题可能不太具体 以下是您通常如何使用该模块 project aeidon P
  • 使用.NET技术录制屏幕视频[关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 有没有一种方法可以使用 NET 技术来录制屏幕 无论是桌面还是窗口 我的目标是免费的 我喜欢小型 低

随机推荐

  • 如何在 RST/阅读文档的代码块中添加复制按钮

    我一直在编写个人 操作方法 指南 记录并保留我的学习日记 我现在有一个几乎太长的代码块 当我自己遇到这么长的代码时 试图仅突出显示该代码块而不突出显示整个页面 或者还不够 总是令人沮丧 所以 我的问题是 对于rst 重构文本 code bl
  • 如何将 PostGIS 添加到 PostgreSQL pgAdmin?

    我已经安装了 PostgreSQL 和 pgAdmin 但我想添加一个 PostGIS 服务器 以便我可以处理地理信息系统项目 我正在跟进本教程 http workshops boundlessgeo com postgis intro c
  • Windows 应用商店应用程序 UI 更新

    我正在为 Windows 8 编写一个 Windows Store App 玩具应用程序 它只有一个 xaml 页面 其中包含TextBlock 该页面的 MyTimer 类为DataContext this DataContext new
  • UITextView从底部开始

    我遇到了问题UI文本视图 我以前见过其他人也遇到过这个问题 但是每当我的应用程序在我的手机上加载时 所有UITextViews从文本的底部开始 我必须向上滚动 我已经尝试了多种解决方案 但我需要一个仅在情节提要上使用的解决方案 因为我有一些
  • dropzone.js 和 jquery 版本兼容性

    我最近在一些项目中使用 dropzone js 并配置选项没有问题 但在一个新项目中我使用的是由 Zend Framework 3 自动安装的最新版本的 jQuery 3 1 0 它似乎会导致一些问题与 dropzone js 版本 4 3
  • 如何在Tomcat(servlet容器)中监听套接字?

    我必须让网络应用程序监听套接字 服务器套接字 并处理套接字流 但该应用程序只是部署在 Tomcat 中 Tomcat 只是一个 servlet 容器 它没有 JCA 支持 并且在servlet线程中建立服务器套接字是不合理的 解决方案1 丑
  • ES6 中符号命名有约定吗?

    我正在摆弄 ES6 查看符号 与 Ruby 不同 例如你会写 symbol ES6符号似乎允许任何 标准 变量名 说实话 我觉得这很令人困惑 var privateProperty Symbol var obj obj privatePro
  • 我们应该在执行某些代码之前还是之后调用超类

    Android Studio 0 4 6 Hello 我这里有一个代码片段 我经常困惑 super 应该是第一行执行还是最后一行 通常 我将其作为第一次调用 以便可以在父类中设置默认属性 但是 我之前看过一些执行此操作的代码 我只是想知道这
  • Try Catch 无法与 PHP 中的 require_once 一起使用?

    我不能做这样的事吗 try require once includes functions php catch Exception e echo Message e gt getMessage echo Code e gt getCode
  • 如何在 Laravel 中使用 paginator::make() 在视图中显示结果集?

    我用过Paginator make对表中的记录进行分页 在视图中 我得到了分页链接 但每个链接都包含其中的所有记录 如何限制它perPage项目 datas Paginator make paginator count paginator
  • GCC中函数调用的参数求值顺序

    当我用谷歌搜索这个时 我总是得到关于评估顺序的线索 一般来说 评估顺序是未指定的 我知道参数评估顺序未指定C一般来说 我的问题是参数评估顺序gcc 从左到右还是从右到左 任何资源链接也将不胜感激 EDIT 消除问题中的歧义 嗯 我说的是当时
  • 使用配置文件添加 WSO2 IS Oauth / OpenId Connect 服务提供商

    我们目前在我们的环境中使用自动化流程 我们有 WSO2 5 3 0 我需要使用 XML 配置文件配置 Oauth2 Openid 服务提供程序 所有文档 示例等均面向 SAML2 而不是 Oauth2 OpenId 有人可以帮助我吗 目前您
  • 根据字符串长度过滤字符串数据

    我喜欢过滤掉字符串长度不等于10的数据 如果我尝试过滤掉其列的任何行A s or B的字符串长度不等于10 我尝试了这个 df pd read csv filex csv df A df A apply lambda x x if len
  • 如何在 Visual Studio 2017 Professional 中打开 ReactJS 项目

    我通过 create react app 和 yo office 命令创建了项目 https dev office com docs add ins excel excel add ins get started react https d
  • C++ 将ASII转义unicode字符串转换为utf8字符串

    我需要读取带有 unicode 转义的标准 ascii 样式字符串 并将其转换为包含 utf8 编码等效项的 std string 因此 例如 u03a0 具有 6 个字符的 std string 应转换为原始二进制文件中具有两个字符 分别
  • 将 Maven Java 编译器调试设置为 false 不会删除行号表?

    也许这是我缺乏理解 但我认为在 Maven Java 项目中执行此操作会禁用所有调试信息进入类文件
  • 为什么固定宽度元素不占用浮动元素旁边的空间?

    In this CodePen http codepen io nitinsavant pen qrvwQd the
  • Qt:以编程方式定义 Tab 键顺序

    我使用 Desinger 创建了 2 个小部件 Widget1 和 Widget2 每个小部件都定义了其 Tab 键顺序 第三个小部件 Widget3 以编程方式定义 并包含垂直布局中的上述 2 个小部件 在 symbian 非触摸设备上
  • C++ 中的舍入和往返数字

    我有一个类 它在内部将某个定点数表示为 32 位整数 分母有些任意 它既不是 2 的幂也不是 10 的幂 为了与其他应用程序通信 数量在输出时转换为普通的旧双精度 并在输入时转换回来 作为类内的代码 它看起来像 int32 t quanti
  • 如何在 C# 中从派生类实例调用基方法?

    我有 C 代码 基础class A并得出class B public class A public virtual void print Console WriteLine a public class B A public overrid