如何将 Activator.CreateInstance 返回的对象转换为它转换的类型?

2023-12-03

在下面的代码中,是否可以将 x 转换为您要传递的类型Activator.CreateInstance提前不知道是什么?我尝试传入typeof...但这行不通。

var testClasses = AppDomain.CurrentDomain.GetAssemblies()
                  .Single(a=>a.FullName.StartsWith("VerifyStuff")).GetTypes()
                  .Where(t=>t.UnderlyingSystemType.Name.StartsWith("VerifyXXX"));

var x = Activator.CreateInstance(testClasses.ElementAt(0));

Thanks!


你只需要投射它:

MyObject x = (MyObject) Activator.CreateInstance(testClasses.ElementAt(0));

当然,如果你有各种各样的类型,这会变得更加困难testClasses。如果它们都派生自相同的基类或实现相同的接口,那么您可以转换为该基类或接口。

Edit:

是否可以将 x 转换为您传递给 Activator.CreateInstance 的类型而不提前知道它是什么?

只是为了更解释一点:x您传递给的类型CreateInstance,但它被转换为一个对象,因为 CreateInstance 不知道你可以向它抛出什么。您的问题发生在您创建具体实例之后 - 您无法将其传递给另一个(强类型)函数,因为您将其作为object。有几种方法可以解决这个问题:

  • 正如我上面提到的,让它们全部派生自相同的基类或接口,以便您可以将它们作为基类或接口类型传递

  • 如果您有一个函数需要对这些具体实例执行操作,请创建一个通用函数来执行此操作:

    
    public T MyFunc(T myConcreteInstance) 
    {
        ... do whatever it is i need to do...
    }
    
  • 这很丑陋,但可能很难避免......使用一个大的如果..否则如果在对它们进行操作之前确定它们的类型的语句(提示:避免使用上面的选项#1...):

    
    Type t = myConcreteInstance.GetType();
    if (t == typeof(someType1))
    {
    
    }
    else if (t == typeof(someType2))
    {
    
    }
    ... etc ...
    

如果此时你正在想“为什么我不直接制作一个通用版本的 CreateInstance() 呢?”那么就不用麻烦了 - 已经有一个了,它仍然不能解决在传递事物之前将其强类型化的问题。引用MSDN:

一般来说,CreateInstance 在应用程序代码中没有用处,因为类型必须在编译时已知。如果类型在编译时已知,则可以使用正常的实例化语法(C# 中的 new 运算符、Visual Basic 中的 New、C++ 中的 gcnew)。

如果您要使用 CreateInstance,那是因为您提前不知道类型,因此您必须解决它。

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

如何将 Activator.CreateInstance 返回的对象转换为它转换的类型? 的相关文章

随机推荐

  • 在 C# 中在服务器上使用 StreamWriter

    我尝试使用以下代码写入远程计算机 StreamWriter remoteMachine admin fileName 我收到以下错误登录失败 用户名未知或密码错误 我得到了用户名 域名和密码 我怎样才能用凭据写信 如果我已经在本次会话中访问
  • Google 的 OpenIDConnect 返回无法解析的 Base64 令牌

    作为理解 OpenIDConnect 的练习 我试图按照本指南在我的网络应用程序中使用 Google 进行身份验证 问题是我无法读取 Google 发送到我的应用程序的令牌 gt var bytes Convert FromBase64St
  • XMLHTTPRequest 响应标头中不包含 Location 字段

    我试图修改 adblockplus 代码以进行测试 我正在修改代码以在 URL 上发送 http get 请求并从响应中获取最终 URL 我尝试使用以下代码 但响应在标头响应中不包含位置字段 我是在 Firefox 扩展中执行此操作 所以我
  • 将 DateTimeindex 转换为仅包含年、小时和日,而不包含时间信息

    我有一个带有索引的数据框 该索引还包含小时 秒 但我只想它包含日期作为年 月 日 索引是否有可能仍然是 DateTimeIndex 但只包含年 月 日 当前索引如下所示 my index DatetimeIndex 2017 08 25 2
  • 如何在Python中实现异或链表?

    鉴于Python对象只是对实际内存对象的引用并且 无法检索对象的内存地址 是否可以在Python中实现XOR链表 如果是的话怎么办 您无法在 Python 中构建 XOR 链表 因为 Python 不允许您弄乱指针中的位 无论如何你都不想实
  • 检查数组 VBA 的值

    我试图确保我构建的数组具有我期望的值 Cards 数组应该填充 Shoe 数组 当我计算数组的值时 我得到了预期的 104 但是当我将这些值粘贴到 Excel 工作表中时 只填充了 13 个单元格 有没有一种简单的方法来检查数组的内容 Su
  • 更新 JPA 或 Hibernate 中的多对多关系

    我有两个Entity就像下面 Entity Table name USER public class User Id private Long id private String name ManyToMany fetch FetchTyp
  • 在ggplot2中的条形图顶部添加不带标签的刻度

    正如标题所说 我想在 ggplot2 条形图的顶部添加刻度 输出看起来像这样 由于机密信息隐藏了实际情节 ggplot2 中有一个函数可以做到这一点吗 我已经在链接中调整了巴蒂斯特的解决方案分面时显示每个子图的 y 轴 想法 我认为 是提取
  • 这是在 JavaScript 中检查有效日期的好方法吗?

    请纠正或解释我的过度简化是错误的 因为我不是 JavaScript 专家 但我只需要知道一个对象是否是有效日期 这仅来自用户输入 即文本框 var is valid date function date try var d new Date
  • 如何从 python 更改 Linux 用户密码

    我在从 python 更改 Linux 用户密码时遇到问题 我已经尝试了很多方法 但无法解决问题 这是我已经尝试过的示例 sudo password是sudo的密码 sudo command是我希望系统运行的命令 user 是从列表中获取的
  • 什么是跳表?

    有人可以解释一下跳转表的机制以及为什么嵌入式系统需要它吗 跳转表可以是函数指针数组 也可以是机器代码跳转指令数组 如果您有一组相对静态的函数 例如系统调用或类的虚拟函数 那么您可以创建此表一次并使用数组的简单索引来调用函数 这意味着检索指针
  • R 中的分桶数据

    我正在尝试创建一个函数 根据给定的向量确定某个值进入哪个存储桶 所以我的函数有两个输入 一个确定存储桶断点的向量 例如 如果向量是 1 4 5 10 则桶将 我现在的做法是首先检查输入数字是否大于向量的最大元素或小于向量的最小元素 如果没有
  • 如何在拖动开始之前缓存整个图层并在拖动结束时将其恢复回来?

    我目前正在尝试稍微加快我的移动设备网络应用程序的速度 但现在我陷入了最重要的部分 缓存 如何在用户开始拖动之前缓存整个图层 并在拖动操作停止时将其恢复为可用的 Kinetic Nodes 现在我开始缓存 stage on mousedown
  • 图像分割结果中的噪声

    我正在做一个基于深度卷积神经网络的图像分割任务 网络结构来自这张纸 其结构如图所示 FCN在图像分割中的应用 该网络的设计基于全卷积网络 and DCAN 该数据集为腺体分割挑战赛公开基准数据集2015年米卡展会 也称为 Warwick Q
  • 为什么结构体中的双精度成员未在 8 字节边界上对齐?

    这是关于内存对齐的 在下面的代码中 我预计结构内 b 的偏移量为 8 32 位机器 看here 从而 使b总是发生在缓存行内 然而 事实并非如此 会员b在全局对象中struct test1似乎是对齐的 我不确定这是偶然的还是编译器故意这样做
  • 从 byte[] 返回文件下载

    这段代码 string xml XmlHelper ToXml queryTemplate byte xmlb StringHelper GetBytes xml var cd new System Net Mime ContentDisp
  • 如何在不使用 JSF 中隐藏标签的情况下将 javascript 内的值传递给托管 bean 属性?

    我们想知道是否可以在 Facelets 中的 javascript 方法内获取托管 bean 属性值 或者将 javascript 值传递给托管 bean 属性但不使用隐藏标记 当我们搜索它们时 我们看到的都是关于使用html隐藏标签或隐藏
  • 实体框架多对多查询:未生成导航属性

    我有两张桌子User and UserRole它们是使用链接表连接的UserInRole 当我生成实体模型时 由于某种原因 实体UserInRole没有生成 从图中可以看出 实体框架理解之间存在多对多关系User and UserRole
  • 如何细分/细化 xarray 数据集中的维度?

    Summary 我有一个数据集 其收集方式使得维度最初不可用 我想获取本质上是一大块无差别的数据 并为其添加维度 以便可以对其进行查询 子集化等 这是以下问题的核心 这是我拥有的 xarray 数据集
  • 如何将 Activator.CreateInstance 返回的对象转换为它转换的类型?

    在下面的代码中 是否可以将 x 转换为您要传递的类型Activator CreateInstance提前不知道是什么 我尝试传入typeof 但这行不通 var testClasses AppDomain CurrentDomain Get