构造函数作为委托 - 在 C# 中可能吗?

2024-01-01

我有一个如下所示的课程:

class Foo
{
  public Foo(int x) { ... }
}

我需要将委托传递给某个方法,如下所示:

delegate Foo FooGenerator(int x);

是否可以直接将构造函数作为FooGenerator值,无需输入:

delegate(int x) { return new Foo(x); }

?

EDIT:就我个人而言,该问题涉及 .NET 2.0,但也欢迎针对 3.0+ 的提示/响应。


我假设您通常会在工厂实现中执行类似的操作,其中实际类型在编译时未知......

首先,请注意,更简单的方法可能是创建后初始化步骤,然后您可以使用泛型:

static T Create<T>({args}) where T : class, ISomeInitInterface, new() {
    T t = new T();
    t.Init(args);
    return t;
}

然后你可以使用MakeGenericMethod and/or CreateDelegate.


否则;你可以即时执行此操作Expression(3.5) 或DynamicMethod (2.0).

The Expression方法更容易编码:

    var param = Expression.Parameter(typeof(int), "val");
    var ctor = typeof(Foo).GetConstructor(new[] { typeof(int) });
    var lambda = Expression.Lambda<Func<int, Foo>>(
        Expression.New(ctor, param), param);
    var func = lambda.Compile();
    Foo foo = func(123);
    string s = foo.ToString(); // proof

或(使用DynamicMethod):

    ConstructorInfo ctor = typeof(Foo).GetConstructor(new[] { typeof(int) });
    DynamicMethod dm = new DynamicMethod("Create", typeof(Foo),
            new Type[] { typeof(int) }, typeof(Foo), true);
    ILGenerator il = dm.GetILGenerator();
    il.Emit(OpCodes.Ldarg_0);
    il.Emit(OpCodes.Newobj, ctor);
    il.Emit(OpCodes.Ret);
    Converter<int, Foo> func = (Converter<int, Foo>)
        dm.CreateDelegate(typeof(Converter<int, Foo>));        
    Foo foo = func(123);
    string s = foo.ToString(); // proof
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

构造函数作为委托 - 在 C# 中可能吗? 的相关文章

  • 如何使用不同的基本路径托管 Blazor WebAssembly 应用程序

    我有一个 Blazor Webassemble NET 托管应用程序 在我们托管它的服务器上 应用程序的基本路径将是mydomain com coolapp 因此 为了尝试让应用程序在服务器上正确呈现 我一直遵循本页 应用程序基本路径 部分
  • 使用 POST 的 HttpWebRequest 的性能

    我有一个用于测试网络服务的小工具 它可以使用 POST 或 GET 调用 Web 服务 使用POST的代码是 public void PerformRequest WebRequest webRequest WebRequest Creat
  • 如何从经过身份验证的 SecurityToken 中获取声明

    我将令牌作为字符串传递到 SOAP 服务中 并验证了该令牌是否有效 我现在有一个 SecurityToken 在调试模式下我可以看到所有声明 特别是我想传递到另一个方法的 userId 声明 我似乎不知道如何获得这些索赔 现在 我解码了令牌
  • Visual Studio 2013 调试器显示 std::string 的奇怪值

    我有一个大型的 cmake 生成的解决方案 其中包含许多项目 由于某种原因 我无法查看字符串的内容 因为根据调试器 Bx Buf含有一些垃圾 text c str 正确返回 Hello 该问题不仅仅发生在本地字符串上 返回的函数std st
  • 在 C# 中解析 JS Date.toIsoString

    我需要将 JS 日期存储为 ISO 8601 日期 我目前正在从格式为 2019 06 22T00 00 00 000Z 的表单中获取日期 正如 JS 的 toIsoString 方法所期望的那样 当这个日期传递到我的 API 控制器时 我
  • 大量互斥体对性能的影响

    假设我有一个包含 1 000 000 个元素的数组 以及多个工作线程 每个线程都操作该数组中的数据 工作线程可能会使用新数据更新已填充的元素 但每个操作仅限于单个数组元素 并且独立于任何其他元素的值 使用单个互斥锁来保护整个数组显然会导致高
  • 使用 STL 流时如何格式化我自己的对象?

    我想将我自己的对象输出到 STL 流 但具有自定义格式 我想出了这样的东西 但由于我之前从未使用过 locale 和 imbue 所以我不知道这是否有意义以及如何实现 MyFacet 和operator 所以我的问题是 这是否有意义以及如何
  • DateTime.ParseExact - 为什么 yy 变成 2015 而不是 1915

    为什么 NET 假定以下年份是 2015 年 而不是 1915 年 var d DateTime ParseExact 20 11 15 dd MM yy new CultureInfo en GB 我想 它会尝试接近 但其背后是否有合理的
  • 当我尝试传递临时地址作为参数时,它是一个 UB 吗?

    对于以下 C 代码 include
  • 为什么连续抛出 2 个异常不会生成无法访问的代码警告?

    为什么以下代码行不会创建编译器警告 void Main throw new Exception throw new Exception 据我所知 编译器应该通知您无法到达第二个抛出异常 这显然是一个编译器错误 它是在 C 3 0 中引入的
  • fgets溢出后如何清除输入缓冲区?

    当输入字符串超出其预定义限制时 我遇到了 fgets 的小问题 以下面的例子为例 for index 0 index lt max index printf Enter the d string index 1 if fgets input
  • MPI - 发送和接收列

    我需要从一个进程发送矩阵列并从另一个进程接收它 我尝试运行以下程序 但得到了一个奇怪的结果 至少我这么认为 仅复制矩阵的第一个元素 某些矩阵元素会发生意外变化 include
  • 从单应性估计 R/T

    我一直在尝试计算 2 个图像中的特征 然后将这些特征传递回CameraParams R没有运气 特征已成功计算并匹配 但是问题是将它们传递回R t 我明白你必须分解Homography为了使这一点成为可能 我已经使用如下方法完成了 http
  • Clang 5.0 上的 vsprintf 和 vsnprintf [-Wformat-nonliteral] 警告

    我有这段代码 static void err doit int errnoflag int level const char fmt va list ap int errno save unsigned long n char buf MA
  • 具有多个父项的 Qt 树模型

    我想构建一棵树 其中一个元素可以引用另一个元素 我想要构建的树是 像这样的东西 A B C D E F P this is a pointer to C D first child of C E second child of C I fo
  • 如何防止 Lotus Notes 用户转发或复制通过 System.Net.Mail 发送的邮件?

    我想使用 SMTP 客户端 uiing microsft net 以 C 作为编程语言发送电子邮件 但是对于通过SMTP客户端发送的电子邮件 我们是否可以添加 禁止转发 或 禁止复制 等安全功能 我不希望电子邮件的收件人转发或复制电子邮件的
  • C++ 中的析构函数

    我的 AB h 文件中有一个构造函数 class AB private int i public AB i 0 constructor AB i 0 destructor virtual void methodA unsigned int
  • 使用通用存储库模式和流畅的 nHibernate

    我目前正在开发一个中型应用程序 它将访问不同站点上的 2 个或更多 SQL 数据库等 我正在考虑使用类似的东西 http mikehadlow blogspot com 2008 03 using irepository pattern w
  • 稀疏矩阵超定线性方程组c/c++库

    我需要一个库来解决 Ax b 系统 其中 A 是一个非对称稀疏矩阵 每行有 8 个条目 而且可能很大 我认为实现双共轭梯度的库应该没问题 但我找不到一个有效的库 我尝试过 iml 但 iml sparselib 包中缺少一些标头 有小费吗
  • 将同步 zip 操作转换为异步

    我们有一个现有的库 其中一些方法需要转换为异步方法 但是我不确定如何使用以下方法执行此操作 错误处理已被删除 该方法的目的是压缩文件并将其保存到磁盘 请注意 zip 类不公开任何异步方法 public static bool ZipAndS

随机推荐

  • Android 中的 OpenGL 入门...

    我是一位经验丰富的 Android 开发人员 如果存在的话 以前从未使用过 OpenGL Android 平台的各种优势 开源 开放分发 可移植等 使我认为它可能是最终进入 OpenGL 的绝佳环境 但我也担心 对于以前从未使用过 3D 图
  • 上传后使用 LiipImagineBundle 调整图像大小?

    我正在使用LiipImagine捆绑包 https github com liip LiipImagineBundle使用 Symfony 2 1 并希望在上传时调整用户上传的图像大小 然后将其保存到永久文件系统位置 以剥离元数据 强制 j
  • IllegalStateException“系统服务在 onCreate() 之前不可用于活动”

    我调查了这个问题 但找不到适合我的代码的任何解决方案 我有四节课 但我确信 名为 Connect 的类没有问题 您将在下面的 JsonData 类上看到它的对象 所以我共享其他三个类 我的主要活动是 public class MainAct
  • 在构造函数中初始化指针的正确方法

    我有以下练习 Add代码使其正常运行 class MyInt public private int MyValue int main int argc char argv MyInt x 1 a bit more code where th
  • Tomcat 中部署的 Spring boot 应用程序中的 @ExceptionHandler 没有返回 @ResponseBody

    我有一个 Spring Boot Web 应用程序 它在 STS 中运行得很好 但在从 WAR 文件在 Tomcat 中运行时显示出不同的行为 我使用 Thymeleaf 处理所有网页 但有几个页面使用 jQuery 发送异步调用并使用户体
  • 为什么u8'A'可以是char类型,而UTF-8最多可以是4个字节,而char通常是1个字节?

    我正在读书wchar t在一般编程中有什么用 https stackoverflow com questions 13509733 并在接受的答案中发现一些令人困惑的事情 更常见的是使用 char 进行可变宽度编码 例如UTF 8 或 GB
  • Swift:如何从资产中获取图像名称

    我的资产文件夹中有 500mb 的图像 我不知道他们的名字 有没有办法访问它们 将它们存储到数组然后显示 示例 我存储了 3 张图像Assets folder1 folder2文件夹 2 包含那 3 个图像 我需要获取这些名称 这就是我需要
  • Selenium-rc:如何在 python 中使用 CaptureNetworkTraffic

    我发现了许多关于 java 中的 selenium 的教程 其中您首先使用以下命令启动 seleniums start captureNetworkTraffic True 但是在Python中start 不接受任何参数 你如何通过这个论点
  • 写入大量、复制、大于内存的键值存储

    我正在寻找可以从 EC2 实例使用的键值存储 item 只是一个非结构化字符串 不需要索引 项目大小可达约 5MB 但通常低于 10kB 很多写入 读取不需要很快 可以把memcache放在前面 缓存经常需要的读取 数据太大 无法装入内存
  • 如何在 ClickOnce 应用程序的无签名程序集项目中设置 LARGEADRESSAWARE?

    我有一个带有接下来两个编译后命令的应用程序 call editbin LARGEADDRESSAWARE TargetPath call editbin LARGEADDRESSAWARE ProjectDir obj PlatformNa
  • 樱桃皮和wxpython

    我正在尝试使用 wxpython ui 制作一个cherrypy 应用程序 问题是两个库都使用闭环事件处理程序 有办法让它发挥作用吗 如果我有 wx ui startcherrypy 会锁定 ui 吗 请参阅我的回答CherryPy 干扰
  • 如何将 csv 文件从 google 云端硬盘上传(并使用它)到 google colaboratory

    想尝试一下 python 和 google colaboratoryseemed最简单的选择 我的谷歌驱动器中有一些文件 想将它们上传到谷歌合作实验室 所以这是我正在使用的代码 pip install U q PyDrive from py
  • Jquery .ajax() 本地测试

    我有一个小的 ajax 函数 它尝试在文档准备好后加载一些内容 document ready function ajax url php accounts blocks php cache false beforeSend function
  • 从 Javascript 触发回发

    好的 我知道这个问题已经被问了很多次 并且我在网上找到了大量有关此问题的信息 不幸的是 这些似乎都不适合我 基本上 我运行一些 JavaScript 来响应用户事件 JavaScript 获取一些信息 一个 int 然后我想将其返回到服务器
  • Google Map API v3 ~ 只需关闭信息窗口?

    尝试简单地关闭信息窗口 我已经有了一系列标记 所以像这样的东西会很好 谢谢 MyMarkers i infowindow close 随着v3 API http code google com apis maps documentation
  • 在一列或多列中查找独特的单词?

    我正在考虑在我的 ASP NET 网站中实现标签 在研究了几种算法之后 我倾向于拥有几个包含一个或多个标签词的数据库列 然后 我将使用全文搜索来查找具有指定标签的行 所有这一切看起来都非常简单 除了一件事 我需要能够生成可用标签列表 用户可
  • R - 按组有条件地对多列进行升序或降序排序

    我以前没有遇到过这个问题 我想根据条件对组内的多列进行升序或降序排序 library dplyr data lt mtcars gt select mpg cyl disp If cyl lt 4 我想排序mpg disp 按该优先级 按升
  • BB10 Cascade 命令行开发

    如果您了解 Qt 那么 BB10 的编程现在应该会容易得多 所以我决定尝试一下 并且我一直在阅读以下内容 https developer blackberry com cascades documentation getting start
  • 在图形环境中,术语“橡皮筋”是什么意思?

    在不同的地方 我都看到过在指代图形绘制时使用的术语 橡皮筋 在这种情况下 人们似乎建议使用 XOR 进行绘图 我的印象是该术语指的是一种用于避免重新绘制整个框架的特定绘图技术 然而 我还没有找到任何可以准确定义 橡皮筋 一词含义的内容 只是
  • 构造函数作为委托 - 在 C# 中可能吗?

    我有一个如下所示的课程 class Foo public Foo int x 我需要将委托传递给某个方法 如下所示 delegate Foo FooGenerator int x 是否可以直接将构造函数作为FooGenerator值 无需输