C#.NET delegate 关键字作为使用委托对象/构造函数调用的函数的名称

2023-12-01

我正在关注一本书,其中使用 delegate 关键字(根据我的理解)作为要封装在委托中的函数的名称(使用委托对象名称/构造函数调用的函数)。下面是代码:

    //Declaration of delegate object AppendChildData
    public delegate void AppendChildData(T entityAggregate, object childEntityKeyValue);

    //Dictionary of Delegate Objects
    private Dictionary<string, AppendChildData> childCallbacks;

    //Creation of dictionary object inside constructor of containing class. Also calling the BuildChildCallbacks() function
protected SqlRepositoryBase(IUnitOfWork unitOfWork)
            : base(unitOfWork)
        {
            this.childCallbacks = new Dictionary<string, AppendChildData>();
            this.BuildChildCallbacks();
           //Other Initializations
        }

    protected override void BuildChildCallbacks()
      {
       this.childCallbacks.Add("allowances", delegate(Project project, object childKeyName) 
            { 
                  this.AppendProjectAllowances(project); 
            });
      }

现在如果仔细观察的话:

delegate(Project project, object childKeyName) 
            { 
                  this.AppendProjectAllowances(project); 
            });

已在 BuildChildCallbacks() 函数中声明为字典 childCallBacks 的值。字典 childCallBacks 的这个值是一个名为 delegate() 的函数。为什么?在这种情况下,.NET 如何使用 delegate 关键字?


我关注的书也使用函数名称而不是使用 delegate 关键字,BuildChlidCallBack 的完整代码如下:

protected override void BuildChildCallbacks()
{
    this.ChildCallbacks.Add(ProjectFactory.FieldNames.OwnerCompanyId, 
        this.AppendOwner);
    this.ChildCallbacks.Add(
        ProjectFactory.FieldNames.ConstructionAdministratorEmployeeId, 
        this.AppendConstructionAdministrator);
    this.ChildCallbacks.Add(ProjectFactory.FieldNames.PrincipalEmployeeId, 
        this.AppendPrincipal);
    this.ChildCallbacks.Add("allowances", 
        delegate(Project project, object childKeyName) 
        { 
            this.AppendProjectAllowances(project); 
        });
    this.ChildCallbacks.Add("contracts",
        delegate(Project project, object childKeyName)
        {
            this.AppendContracts(project);
        });
    this.ChildCallbacks.Add("contacts",
        delegate(Project project, object childKeyName)
        {
            this.AppendContacts(project);
        });
}

经过仔细观察,我发现在字典键不是外键(不是 DataTable 的列)的情况下使用了 delegate 关键字,并且调用这些委托将 NULL 传递给第二个参数,即 delegate() 函数的“childKeyName”。使用字典调用 delegate() 函数的代码如下:

protected virtual T BuildEntityFromReader(IDataReader reader)
{
    T entity = this.entityFactory.BuildEntity(reader);
    if (this.childCallbacks != null && this.childCallbacks.Count > 0)
    {
        object childKeyValue = null;
        DataTable columnData = reader.GetSchemaTable();
        foreach (string childKeyName in this.childCallbacks.Keys)
        {
            if (DataHelper.ReaderContainsColumnName(columnData, childKeyName))
            {
                childKeyValue = reader[childKeyName];
            }
            else
            {
                childKeyValue = null;
            }
            this.childCallbacks[childKeyName](entity, childKeyValue);
        }
    }
    return entity;
}

其中函数中的读取器是 IDataReader,它包含 DataTable 中的单个记录/实体/行(函数中的读取器类型是 reader.read)。

我的问题是,为什么委托词被用作函数名称来分配给 childCallBack 字典中的 AppendChildData 委托对象,而不是函数名称? (因为它编译并运行良好)

并且,在这种情况下,.NET 如何使用 delegate 关键字?


如果我正确理解你的问题,那么你对关键字的使用感到困惑delegate在不同的地方。

public delegate void AppendChildData(T entityAggregate, object childEntityKeyValue);

的排序答案delegate上面是

委托是一种定义方法签名的类型。实例化委托时,可以将其实例与具有兼容签名的任何方法关联。您可以通过委托实例调用(或调用)该方法。您可以找到更多关于MSDN

在第二种情况如下

protected override void BuildChildCallbacks()
  {
   this.childCallbacks.Add("allowances", delegate(Project project, object childKeyName) 
        { 
              this.AppendProjectAllowances(project); 
        });
  }

delegate用于声明anonymous method。一句话,就是无名方法。更多描述在这里MSDN

最后但并非最不重要的一点是,将来你应该更具体地回答你的问题。 :)

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

C#.NET delegate 关键字作为使用委托对象/构造函数调用的函数的名称 的相关文章

  • Tensorflow 中的自定义资源

    由于某些原因 我需要为 Tensorflow 实现自定义资源 我试图从查找表实现中获得灵感 如果我理解得好的话 我需要实现3个TF操作 创建我的资源 资源的初始化 例如 在查找表的情况下填充哈希表 执行查找 查找 查询步骤 为了促进实施 我
  • C++ 中的软(不是:弱)引用 - 这可能吗?有实施吗?

    在 C 中我正在使用boost shared ptr and boost weak ptr自动删除不再需要的对象 我知道这些与引用计数一起工作 在 Java 中 内存由垃圾收集器管理 它将内置对象引用视为strong WeakReferen
  • std::map 和二叉搜索树

    我读过 std map 是使用二叉搜索树数据结构实现的 BST 是一种顺序数据结构 类似于数组中的元素 它将元素存储在 BST 节点中并按其顺序维护元素 例如如果元素小于节点 则将其存储在节点的左侧 如果元素大于节点 则将其存储在节点的右侧
  • TextBox 焦点的 WinForms 事件?

    我想添加一个偶数TextBox当它有焦点时 我知道我可以用一个简单的方法来做到这一点textbox1 Focus并检查布尔值 但我不想那样做 我想这样做 this tGID Focus new System EventHandler thi
  • 为什么 BOOST_FOREACH 不完全等同于手工编码的?

    From 增强文档 http www boost org doc libs 1 48 0 doc html foreach html foreach introduction what is literal boost foreach li
  • 如何在 VS 中键入时显示方法的完整文档?

    标题非常具有描述性 是否有任何扩展可以让我看到我正在输入的方法的完整文档 我想查看文档 因为我可以在对象浏览器中看到它 其中包含参数的描述和所有内容 而不仅仅是一些 摘要 当然可以选择查看所有覆盖 它可能是智能感知的一部分 或者我不知道它并
  • 为什么密码错误会导致“填充无效且无法删除”?

    我需要一些简单的字符串加密 所以我编写了以下代码 有很多 灵感 来自here http www codeproject com KB security DotNetCrypto aspx create and initialize a cr
  • 如何用 kevent() 替换 select() 以获得更高的性能?

    来自Kqueue 维基百科页面 http en wikipedia org wiki Kqueue Kqueue 在内核和用户空间之间提供高效的输入和输出事件管道 因此 可以修改事件过滤器以及接收待处理事件 同时每次主事件循环迭代仅使用对
  • 禁用 LINQ 上下文的所有延迟加载或强制预先加载

    我有一个文档生成器 目前包含约 200 个项目的查询 但完成后可能会超过 500 个 我最近注意到一些映射表示延迟加载 这给文档生成器带来了一个问题 因为它需要根据生成的文档来访问所有这些属性 虽然我知道DataLoadOptions可以指
  • C# 创建数组的数组

    我正在尝试创建一个将使用重复数据的数组数组 如下所示 int list1 new int 4 1 2 3 4 int list2 new int 4 5 6 7 8 int list3 new int 4 1 3 2 1 int list4
  • C# 编译器如何决定发出可重定向的程序集引用?

    NET Compact Framework 引入了可重定向程序集引用 现在用于支持可移植类库 基本上 编译器会发出以下 MSIL assembly extern retargetable mscorlib publickeytoken 7C
  • “MyClass”的类型初始值设定项引发异常

    以下是我的Windows服务代码 当我调试代码时 我收到错误 异常 CSMessageUtility CSDetails 的类型初始值设定项引发异常 using System using System Collections Generic
  • 如何排列表格中的项目 - MVC3 视图 (Index.cshtml)

    我想使用 ASP NET MVC3 显示特定类型食品样本中存在的不同类型维生素的含量 如何在我的视图 Index cshtml 中显示它 an example 这些是我的代码 table tr th th foreach var m in
  • 从匿名类型获取值

    我有一个方法如下 public void MyMethod object obj implement 我这样称呼它 MyMethod new myparam waoww 那么我该如何实施MyMethod 获取 myparam 值 Edit
  • C# 搜索目录中包含字符串的所有文件,然后返回该字符串

    使用用户在文本框中输入的内容 我想搜索目录中的哪个文件包含该文本 然后我想解析出信息 但我似乎找不到该字符串或至少返回信息 任何帮助将不胜感激 我当前的代码 private void btnSearchSerial Click object
  • gdb查找行号的内存地址

    假设我已将 gdb 附加到一个进程 并且在其内存布局中有一个文件和行号 我想要其内存地址 如何获取文件x中第n行的内存地址 这是在 Linux x86 上 gdb info line test c 56 Line 56 of test c
  • 如何检测 C# 中该字典键是否存在?

    我正在使用 Exchange Web 服务托管 API 和联系人数据 我有以下代码 即功能性的 但并不理想 foreach Contact c in contactList string openItemUrl https service
  • 同时从多个流中捕获、最佳方法以及如何减少 CPU 使用率

    我目前正在编写一个应用程序 该应用程序将捕获大量 RTSP 流 在我的例子中为 12 个 并将其显示在 QT 小部件上 当我超过大约 6 7 个流时 问题就会出现 CPU 使用率激增并且出现明显的卡顿 我认为它不是 QT 绘制函数的原因是因
  • 如何查明CONFIG_FANOTIFY_ACCESS_PERMISSIONS是否启用?

    我想利用fanotify 7 http man7 org linux man pages man7 fanotify 7 html我遇到的问题是在某些内核上CONFIG FANOTIFY ACCESS PERMISSIONS不起作用 虽然C
  • Azure函数版本2.0-应用程序blobTrigger不工作

    我有一个工作功能应用程序 它有一个 blob 输入和一个事件中心输出 在测试版中工作 随着最新的更改 我的功能不再起作用 我尝试根据发行说明更新 host json 文件 但它没有引用 blob 触发器 version 2 0 extens

随机推荐

  • 从 Visual Studio 将文件添加到 WP7 独立存储?

    我正在开发一个 Windows Phone 7 应用程序 我将在其中使用 bing 地图显示您所在位置的 ATM 我有一个包含地址和 GPS 坐标的 xml 文件 但是如何从 Visual Studio 将此文件添加到我的程序中 如果我将
  • 关闭连接之前关闭阅读器

    您是否应该始终在关闭连接之前关闭 DataReader 还是直接关闭连接就可以了 通过关闭连接是否会有效地关闭读者 这是针对 c net 3 5 的 Thanks 除了明确你的意图之外 Microsoft 文档中还提到了这一点 使用 Dat
  • Chrome 上的 Angular2 Table Row 组件以单列显示

    使用中的版本 角2 0 1 角度 cli 1 0 0 beta 17 我有一个页面分为 3 个组件 页面大纲是一个具有自己的布局 包括行 的表格 其中一行包含行组件 在 IE 中 表格显示良好 在 Chrome 中 组件行中的所有数据都显示
  • ObjectContext 实例已被释放 - Winforms Entity Framework

    I am trying to solve this problem and did read content regarding this error but was unable to figure out a solution I am
  • 如何为postgres docker容器的初始化脚本指定当前工作数据库?

    众所周知 可以使用类似于以下命令的 docker 命令复制要在创建容器时执行的 init sql 文件 COPY init sql docker entrypoint initdb d 让我们考虑使用一个非常简单的 create table
  • 前置“\\?\”不适用于处理长路径

    我正在尝试找到一种解决 Windows 字符限制的方法 该限制不允许复制文件名 gt 260 个字符的文件 根据这篇 MSDN 文章 if 附加在文件名前面 这将绕过文件名长度限制 我尝试过这个测试 string source C User
  • 如何设置WebView内容比例(qml QT 5.2)

    我使用 qml WebView QT 5 2 WebView anchors fill parent url http google com 加载的页面内容根据 WebView 宽度进行缩放 如何获得像浏览器中那样的默认比例 left pi
  • 使用 NLTK,当给出某个单词时,如何生成不同形式的单词?

    例如 假设给出 happy 这个词 我想生成其他形式的happy 例如幸福 幸福 等 我已经阅读了有关 Stackoverflow 和 NLTK 参考资料的其他一些先前问题 然而 只有词性标注 变形就像识别句子中某些单词的语法形式 而不是生
  • 来自数据库的动态下拉列表值

    如何将主下拉列表的值连接到子下拉列表中 下拉列表的值来自数据库 main list 和 sub list 表 而且身体加载也不起作用 主列表 id value id no 1 colors 1 2 fruits 2 3 animals 3
  • 位置提供商真的很耗电吗?

    我需要实现基于位置的服务 我不需要精确的位置 所以不需要 GPS 最简单的方法是在应用程序启动时开始侦听位置更新 并将其保留为打开状态 mLocationMgr requestLocationUpdates LocationManager
  • .gitignore 被 Git 忽略

    My gitignore文件似乎被 Git 忽略了 可以吗 gitignore文件损坏 Git 需要哪种文件格式 区域设置或文化 My gitignore This is a comment debug log nbproject 输出来自
  • 在 Rails 中使用 jquery 和 Ajax 检查用户名可用性

    我使用 Rails 和 jquery 和 ajax 来检查用户名的可用性 我在用 以下插件用于 jquery 验证目的 https github com posabsolute jQuery Validation Engine 在我的控制器
  • 使用 Flex Mobile 4.6 在 iOS 上上传图库或捕获的图像

    有谁有使用 iOS Flex 4 6 中的相机 API 的经验吗 我遇到了很多设置问题并且缺少文档 我正在尝试设置一个图像上传组件 用户可以在其中捕获新照片或从其库中选择现有照片 对于捕获来说 当图像保存为 JPEG 时 并且我正在使用 A
  • 聚类中的大距离矩阵

    我在 16 GB RAM 的机器上运行 R 3 2 3 我有一个 3 00 000 行 x 12 列的大矩阵 我想在 R 中使用层次聚类算法 所以在这之前 我尝试创建一个距离矩阵 由于数据是混合类型 我对不同类型使用不同的矩阵 我收到有关内
  • Angular2 处理 http 响应

    我只是有一个关于构建和处理服务中 http 请求响应的问题 我在用Angular2 alpha46 打字稿 刚刚开始测试它 我喜欢它 Ps 感谢所有致力于此工作并通过 github 做出贡献的人 因此采取以下措施 登录表单 componen
  • Nuget 下载脚本时出现问题

    好吧 以前也发生过这种情况 我不确定这是怎么回事 我去安装这个nuget包 Microsoft jQuery Unobtrusive Ajax 使用命令行和 GUI 都可以 正确 安装该软件包 但我的项目中没有添加脚本 我在使用 MVC6
  • 如何获取从“UIImagePickerController”接收的图像的压缩文件大小?

    我想知道拍摄的图像的大小UIImagePickerController通过卡马拉或图书馆 有什么办法可以找到吗 要求就像 如果图像大小超过 1 MB 我想对其进行压缩 提前致谢 尝试这个 CGFloat compression 0 8f C
  • 接口方法中的最终参数 - 有什么意义?

    在Java中 定义是完全合法的final接口方法中的参数 并且不遵守实现类中的参数 例如 public interface Foo public void foo int bar final int baz public class Foo
  • 在 Pandas DF 中使用删除重复项,但根据首选项列表选择保留列

    我有包含许多列的数据框 有一个日期时间列 并且有重复的日期时间条目以及来自不同源的这些重复项的数据 我想根据以下内容删除重复项column dt 但我想根据其中的内容保留结果column pref 我在下面提供了简化的数据 但这样做的原因是
  • C#.NET delegate 关键字作为使用委托对象/构造函数调用的函数的名称

    我正在关注一本书 其中使用 delegate 关键字 根据我的理解 作为要封装在委托中的函数的名称 使用委托对象名称 构造函数调用的函数 下面是代码 Declaration of delegate object AppendChildDat