为什么我无法实例化从匿名对象推断类型的泛型类?

2024-01-30

假设我有一些课程 - 假设的例子:

public class InvalidResponseException<TReq, TResp> : Exception
{
    public TReq RequestData { get; protected set; }
    public TResp ResponseData { get; protected set; }

    public InvalidResponseException(string message, TReq requestData, TResp responseData)
        : this(message, null, requestData, responseData)
    {
    }

    public InvalidResponseException(string message, Exception innerException, TReq requestData, TResp responseData)
        : base(message, innerException)
    {
        RequestData = requestData;
        ResponseData = responseData;
    }
}

好的,类定义了......并且编译,没问题。

因此,可以说在我的代码正文中的其他地方,我想抛出此异常并将匿名对象传递到一种或多种类型的异常中。这应该使它足够通用,以便我可以在任何从代码库中的某些调用获得意外响应的地方使用它:

var reqData = new { 
    Context = SomeDataContext,
    Username = SomeUserName,
    ParentID = 54,
    RequestValues = ListOfItemsToGet
}

var respData = results.ToList();

string exceptionMessage = string.Format("Invalid response data detected. Requested {0} items received {1}.", ListOfItemsToGet.Count(), results.Count());

throw new InvalidResponseException(exceptionMessage, reqData, respData);

对于大多数匿名调用,您可以使用类型推断,因此您不必在方法调用中定义类型...但是这段代码将无法编译。

如果我将鼠标悬停在 reqData 的“var”上,编译器会告诉我有一个为其定义的类型,尽管这是一个没有人可以手动分配的奇怪名称......所以理论上我认为可以从中推断出该类型。

我最初的结论是,您不能将匿名类型传递给泛型,但是您确实可以以某种方式将匿名对象传递给泛型:

var BritishExpats = from p in People
                    where p.CountryOfBirth == "United Kingdom" && p.CountryOfResidents != p.CountryOfBirth
                    select new { FirstName = p.FirstName, LastName = p.LastName }

这里“BritishPeople”是一个 IEnumerable,其中 T 被推断为 'a

...我可以迭代生成的匿名对象 IEnumerable 并引用它们的公共属性,没有任何问题...

foreach (var ExPat in BritishExpats)
{
    Console.WriteLine("{0}, {1}", Expat.LastName, Expat.FirstName);
}

当然,我必须在循环中使用“var”,因为我们不really知道“BritishExpats”是什么类型。

因此,我可以使用匿名对象推断的类型实例化某些类型的类,但不能实例化其他类型的类......

...对于匿名对象可以和不能实例化、推断和推断什么有规律或理由吗?


您不能将泛型、匿名类型和类型推断放在构造函数中。编译器就是无法理解它。您可以通过辅助类创建解决方法,例如:

public static class InvalidResponseExceptionHelper
{
    public static InvalidResponseException<TReq, TResp> Create<TReq, TResp>
        (string message, TReq requestData, TResp responseData)
    {
        return new InvalidResponseException<TReq, TResp>(message, 
            requestData, responseData);
    }
}

另外,我没有提到,但是你的InvalidResponseException除非进行大量修改,否则类不会编译。然而,你的问题的概念已经通过了。

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

为什么我无法实例化从匿名对象推断类型的泛型类? 的相关文章

  • 是否保证 sizeof(T[N]) == N * sizeof(T) ?

    我一直假设 N 个元素类型的数组的大小T 由返回sizeof保证正好是N次sizeof T The 对这个问题的评论 https stackoverflow com questions 46457449 is it always the c
  • 如何用另一个静态变量初始化一个静态变量?

    静态1 hpp include
  • .NET 中的 Class.forName() 等效项?

    动态获取对象类型然后创建它的新实例的 C 方法是什么 例如 如何在 C 中实现以下 Java 代码的结果 MyClass x MyClass Class forName classes MyChildClass newInstance Lo
  • 为什么 fgets 接受 int 而不是 size_t?

    功能如strcpy malloc strlen 和其他各种接受他们的参数或返回值作为size t代替int or an unsigned int出于显而易见的原因 一些文件功能 例如fread and fwrite use size t以及
  • C 中的 '\0' 和 printf()

    在 C 入门课程中 我了解到在存储字符串时存储空字符 0在它的最后 但是如果我想打印一个字符串怎么办 printf hello 虽然我发现它并没有结束 0通过以下声明 printf d printf hello Output 5 但这似乎不
  • C 链表销毁函数

    我正在尝试学习 C 和很多人一样 我对指针有点困惑 无论如何 我创建了一个递归函数来销毁我的链表 但是正如我调试的那样 当我从函数返回时 列表的头部不应该为空 所以我猜这是对指针的一些基本误解 这是函数 void destroy struc
  • 为什么 ObservableCollection 有两个集合构造函数?

    The 可观察集合 T https msdn microsoft com en us library ms668604类有两个构造函数 可以在其中传递项目集合 一个构造函数接受一个IEnumerable T 另一个List T 鉴于List
  • 微软怎么能说WinAPI中一个字的大小是16位呢?

    我刚刚开始学习WinAPI 在MSDN中 对WORD数据类型提供了以下解释 WORD16 位无符号整数 范围是十进制 0 到 65535 该类型在 WinDef h 中声明如下 typedef 无符号短 WORD 很简单 而且它与我一直在使
  • 为什么我收到编译错误“使用已删除的函数 'std::unique_ptr ...”

    我收到一条巨大的编译错误消息 c mingw include c 6 1 0 bits predefined ops h 123 18 error use of deleted function std unique ptr lt Tp D
  • Web浏览器控件:如何捕获文档事件?

    我正在使用 WPF 的 WebBrowser 控件加载一个简单的网页 在这个页面上我有一个锚点或一个按钮 我想在我的应用程序后面的代码中 即在 C 中 捕获该按钮的单击事件 WebBrowser 控件是否有办法捕获加载页面元素上的单击事件
  • FFplay成功移入我的Winform中,如何设置它无边框?

    用这个代码 在 C 应用程序中显示 tcp 视频流 来自 FFPLAY FFMPEG https stackoverflow com questions 14201894 show a tcp video stream from ffpla
  • 在 Linq 查询中使用动态列名称

    foreach Dimension dimensions in Enum GetValues typeof Dimension var r new ReferenceTable dimensions referenceItems List
  • 使用信号和槽更新指针

    我对 Qt 很陌生 请帮我解决这个问题 我正在使用线程在后台执行密集操作 同时我想更新 UI 所以我使用 SIGNALS 和 SLOTS 为了更新 UI 我发出一个信号并更新 UI 让我们考虑下面的示例代码 struct sample QS
  • 当一对迭代器初始化时,向量是否知道先保留?

    考虑以下代码 struct MyData MyData const BYTE pData size t uSize bucket pData pData uSize std vector
  • 快速将文本附加到文本框

    我有一个BackgroundWorker正在发布消息的线程 使用BeginInvoke在 GUI 中的文本框中 方法 write debug text 在文本框中显示文本使用AppendText并将文本写入Console 外观上是这样的Ba
  • 使用 DataGridViewCheckboxCell 真正禁用 DataGridView 中的复选框

    有谁知道如何使用 DataGridViewCheckboxCell 禁用 DataGridView 中的复选框 我可以将其设置为只读 并设置背景颜色 但我无法让复选框本身显示为禁用状态 有什么想法吗 Guess 你必须自己画 http so
  • 从数据库配置中的连接字符串中删除 SSIS 密码

    我有一个 SSIS 包 它使用 SQL 服务器中的 SSIS 配置表来检索 OLE DB 连接管理器的连接字符串属性 问题是我还需要相同的连接字符串来调用使用实体框架的程序集 我尝试访问连接管理器连接字符串属性 但 SSIS 总是删除密码
  • 打印任何类型的数组和列表的通用方法[重复]

    这个问题在这里已经有答案了 每当我调试一段涉及整数 双精度 字符串等数组或列表的代码时 有时我更喜欢打印它们 我为此所做的是为不同类型编写重载的 printArray printList 方法 for e g 我可能有这 3 种方法来打印各
  • 从其对象获取结构体字段的名称和类型

    例如 我有一个类似这样的结构 struct Test int i float f char ch 10 我有一个该结构的对象 例如 Test obj 现在 我想以编程方式获取字段名称和类型obj 是否可以 顺便说一句 这是 C 你正在要求C
  • 从 C/C++ 程序进行 Ping

    我想编写一个 C 或 C 程序 给定一个 IP 地址 对其进行 Ping 然后根据 Ping 是否成功执行进一步的操作 这个怎么做 尽情享受Ping 页面 http www ping127001 com pingpage htm 其中有一个

随机推荐

  • Python:如何将进程轮询和非阻塞 WebSocket 服务器结合起来?

    我有个主意 编写一个基于 WebSocket 的 RPC 该 RPC 将根据以下场景处理消息 客户端连接到 WS Web 套接字 服务器 客户端向WS服务器发送消息 WS服务器将消息放入传入队列 可以是multiprocessing Que
  • 按 RDD 值从 Cassandra 表中过滤

    我想根据 RDD 中的值从 Cassandra 查询一些数据 我的方法如下 val userIds sc textFile tmp user ids keyBy e gt e val t sc cassandraTable keyspace
  • 如何在 npm 包中捆绑依赖项?

    我有一个 npm 包 它引用了其他本地包 它有这样的结构 deploy typescriptapp tgz references mydependency 包 json app js app css typescriptapp 包 json
  • 中间人:从 Markdown 引用存储在数据文件中的 URL

    For my 中间人构建的网站我已将所有页面的链接和其他信息存储在数据文件中 https middlemanapp com advanced data files data pages yaml pageA link some long u
  • 关于 Nix 包管理的 Nix 表达式是什么?

    即使在阅读了 Nix 手册之后 仍然对 Nix 表达式的真正含义感到困惑 有时它们被称为派生 但存储派生也有其他含义 在尼克斯 一个尼克斯表达只是您可以用 Nix 语言编写的任何类型值的通用术语 Nix 表达式可以是集合 列表 数字 字符串
  • 如何将 Google Plus 与 iPhone sdk 集成?

    我想将 google plus 集成到我的应用程序中 但我不知道从哪里开始 所以如果有人对此有任何想法 请回复我 以此为基础 gt https developers google com api https developers googl
  • 如何从 ORMLite 的 sqlite 数据库生成 java 类代码

    给定一个 sqlite 数据库作为输入 我想知道如何生成一个ORMLite http ormlite com 与关联数据库映射的java类 非常感谢 你可以尝试Telosys 工具 一个用于代码生成的 Eclipse 插件从现有数据库工作具
  • 文件上传大文件 PHP/AJAX [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • Github API - 检索用户提交?

    我正在尝试构建一种方法 在该方法中我可以访问 Github 用户名 并发布该用户的所有提交或至少一些提交 是否有调用 GET user repo commit 关联或直接用户 提交 现在 我认为需要采取以下措施 获取与特定名称关联的存储库
  • Option 类型的类型转换

    我是 Python 的 Rust 新手 我相信这是一个基本问题 但我太新了 无法通过诸如类型转换选项 在Python中 让类型检查器知道返回类型不是Optional int int 我们可以解决assert强制类型检查器知道的逻辑x永远不会
  • 在python中分配列表中的每个第N个元素

    我想将列表中的每个第 N 个元素设置为其他值 Like 这个问题 https stackoverflow com questions 14994140 how do you make every other integer in an ar
  • C语言中指针可以指向自身内存地址吗?

    在下面的代码中 一个指针指向它自己的内存地址 include
  • Hibernate:多对多连接表的标准?

    考虑以下两个关系 Entity class Foo Id id ManyToMany JoinTable name ATag joinColumns JoinColumn name foo id inverseJoinColumns Joi
  • Python 中 import 和 __import__ 的区别

    我正在查看项目的一些提交 我在文件中看到以下更改 import dataFile dataFile import dataFile 编码器被替换import dataFile by dataFile import dataFile 它们之间
  • 谷歌云存储坏了? [关闭]

    Closed 这个问题是无法重现或由拼写错误引起 help closed questions 目前不接受答案 今天我不断得到 The request s content type is not accepted on this URL 对于
  • 将图像放置在右上角 - CSS

    我需要在 div 的右上角显示图像 该图像是 对角线 功能区 但将当前文本保留在内部 div 中 就像粘在其顶部一样 我尝试了不同的方法 例如将图像包含在另一个 div 中或定义其类 例如 ribbon position relative
  • Postgres数据库如果不存在则创建[重复]

    这个问题在这里已经有答案了 有没有类似的CREATE TABLE IF NOT EXISTS用于创建数据库 背景 我正在编写一个脚本来在未知系统上自动设置 PostgreSQL 中的架构 我不确定数据库 甚至是架构的一部分 是否已经部署 因
  • 如何在 Erlang/OTP 中将 datetime() 转换为 timestamp()?

    我需要转换 2012 9 21 13 21 11 into timestamp 我怎样才能做到这一点 更正版本 Seconds calendar datetime to gregorian seconds DateTime 62167219
  • 具有相同名称的函数声明内的函数声明 javascript

    我刚刚在 javascript 中看到了这种模式 var test function function test args this properties args etc test prototype methodName functio
  • 为什么我无法实例化从匿名对象推断类型的泛型类?

    假设我有一些课程 假设的例子 public class InvalidResponseException