有没有一种方法可以将对象强制转换回其原始类型而不指定每种情况?

2023-12-07

我有一个不同类型对象的数组,我使用 BinaryWriter 将每个项目转换为其二进制等效项,以便我可以通过网络发送该结构。

我目前正在做类似的事情

for ( i=0;i<tmpArrayList.Count;i++)
{
   object x=tmpArrayList[i];
   if (x.GetType() ==  typeof(byte))
   {
      wrt.Write((byte)x);
   }
   ........

问题是,如果错过了某个类型,我的代码将来可能会崩溃。

我想做类似的事情。

object x=tmpArrayList[i];
wrt.Write(x);

但除非我完成每个演员表,否则它不起作用。

Edit:

在咨询了答案之后,这就是我对该功能的想法。为了测试此函数将数组发送到系统日志。

  private void TxMsg(ArrayList TxArray,IPAddress ipaddress)
  {
     Byte[] txbuf=new Byte[0];
     int sz=0;

     // caculate size of txbuf
     foreach (Object o in TxArray)
     {
        if ( o is String ) 
        {
           sz+=((String)(o)).Length;
        }
        else if ( o is Byte[] )
        {
           sz+=((Byte[])(o)).Length;
        }
        else if ( o is Char[] )
        {
           sz+=((Char[])(o)).Length;
        }
        else // take care of non arrays
        {
           sz+=Marshal.SizeOf(o);
        }
     }
     txbuf = new Byte[sz];

     System.IO.MemoryStream stm_w = new System.IO.MemoryStream( txbuf, 0,txbuf.Length);
     System.IO.BinaryWriter wrt = new System.IO.BinaryWriter( stm_w );

     foreach (Object o in TxArray)
     {
        bool otypefound=false;
        if (o is String) // strings need to be sent one byte per char
        {
           otypefound=true;
           String st=(String)o;
           for(int i=0;i<st.Length;i++)
           {
              wrt.Write((byte)st[i]);
           }
        }
        else
        {
           foreach (MethodInfo mi in typeof(BinaryWriter).GetMethods())
           {
              if (mi.Name == "Write")
              {
                 ParameterInfo[] pi = mi.GetParameters();
                 if ((pi.Length == 1)&&(pi[0].ParameterType==o.GetType()))
                 {
                    otypefound=true;
                    mi.Invoke(wrt, new Object[] { o });
                 }
              }
           }
        }
        if(otypefound==false)
        {
           throw new InvalidOperationException("Cannot write data of type " + o.GetType().FullName);
        }
     }
     IPEndPoint endpoint = new IPEndPoint(ipaddress, 514); //syslog port
     UdpClient udpClient_txmsg = new UdpClient();
     udpClient_txmsg.Send(txbuf, txbuf.Length,endpoint); // send udp packet to syslog             
  }

不可以。必须在编译时知道强制转换,但实际类型只有在执行时才知道。

但请注意,有一种更好的方法可以调用 GetType 来测试类型。代替:

if (x.GetType() == typeof(byte))

Use:

if (x is byte)

编辑:回答额外的问题:

“都有哪些类型?”好吧,看看 BinaryWriter 的文档,我想......

“我需要担心字节和字节吗?”不,byte 是 C# 中 System.Byte 的别名。他们是同一类型。

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

有没有一种方法可以将对象强制转换回其原始类型而不指定每种情况? 的相关文章

随机推荐

  • 像内置 WP7 一样的图像/照片库

    我正在寻找适用于 Windows Phone 7 的照片库 它的外观和工作方式与内置照片查看器相同 使用轻拂操作幻灯片照片 使用捏合 拖动调整大小 当您轻拂图像时 您可以看到它滑动到下一个图像 并将列表捕捉到该图像 我已经为图像构建了调整大
  • 正则表达式包括字母数字和 _

    我正在尝试创建一个正则表达式来匹配字母数字字符和下划线 这是我的正则表达式 w s 我的印象是这个正则表达式意味着任何字母数字字符 w 下划线 和不 或空格 它是否正确 正则表达式被读取为实际匹配字符串中字符的模式 从左到右 因此您的模式实
  • 最大化直方图下的矩形区域

    我有一个具有整数高度和恒定宽度 1 的直方图 我想最大化直方图下的矩形区域 例如 答案是 6 3 2 使用 col1 和 col2 O n 2 蛮力对我来说很清楚 我想要一个 O n log n 算法 我试图按照最大递增子序列 O n lo
  • Angular4:ng-template 内的组件引用

    我是角度 4 的新手 我想获取 ng template 内组件 验证警报 的句柄
  • 将本机指针转换为 C++\CLI 托管对象引用?

    我有一个通过委托调用的回调 在其中 我需要处理从记录过程到达的缓冲区数据 通常 在非托管上下文中 我可以对 dwParam1 执行reinterpret cast 来获取对象引用 但在托管上下文中 如何将 DWORD PTR 转换为托管对象
  • 多线程场景中的 Microsoft.ACE.OLEDB.12.0 错误

    我在 x64 应用程序中使用Microsoft Access 数据库引擎 2010 Microsoft Office 2016 的一部分 用于处理 mdb 文件 但是 当前版本的 Microsoft Access Database Engi
  • 流程输出仅在流程完成后才可用

    我有一个 Runnable 它从外部调用的 exe 见下文 读取控制台输出并将其写入日志文件和 JTextArea 但在 exe 完全完成之前 我的 Runnable 不会在 JTextArea 中显示控制台输出 如何让它在发生时打印控制台
  • 从外部连接kafka的问题

    我正在使用 hortonwork Sandbox 作为 kafka 服务器 尝试使用java代码从eclipse连接kafka 使用此配置连接到生产者发送消息 metadata broker list sandbox hortonworks
  • 使用endswith读取文件列表在列表中找不到扩展名

    我试图让我的 python 脚本读取一个文本文件 其中包含带有扩展名的文件名列表 并在找到特定扩展名时打印出来 确切地说是 txt 文件 它读取文件并遍历每一行 我通过在 for 语句后放置一个简单的 打印行 进行测试 但当它在行中看到 t
  • Color_FormatSurface 实现

    是否有关于 Color FormatSurface AndroidOpaque 颜色格式的可用文档 我的视频编码器目前不支持这种格式 我应该添加该功能 但我找不到任何有关它的信息 任何帮助 将不胜感激 没有关于它的文档 因为它是不透明的 这
  • 在Azure DevOps中如何使用REST API触发发布?

    我在 Azure DevOps 中构建和发布管道 该管道包含三个不同的阶段 即分阶段 QA 和 PROD 因此 在 QA 槽中完成部署后 我想使用 REST API 触发 PROD 环境 那么 是否可以做同样的事情呢 在单个发布管道中不可能
  • Javascript Date() 构造函数不起作用

    我有一个问题 JavaScriptDate mm dd yyyy 构造函数不适用于 FF 对于 IE 来说效果很好 IE new Date 04 02 2008 gt Wed Apr 2 00 00 00 EDT 2008 FF2 new
  • Instagram OAuthException:您必须提供 client_id

    我一直在尝试在我的网络应用程序中使用 instagram API 的服务器端身份验证 我已按照以下位置提供的步骤进行操作Intagram 的 API 页面 但我不断收到错误you must provide a client id 代码是用n
  • 未捕获的引用错误:__ng_jsonp____req0_finished 未定义于

    我有一个 Angular 应用程序 并且也在使用 JSONP 这是我的服务 import Injectable from angular core import Http Response Headers RequestOptions fr
  • 如何返回列表中以“b”开头的第二个元素

    我有这个函数 其中包含包含字符串的列表 我必须找到此列表中以 b 开头的第二个元素 例如 second elemnt starting with b b a bb gt bb 使用a会更有效发电机 而不是通过迭代整个初始列表来构建以 b 开
  • IIS 7.5 + 为 RESTFul 服务启用 PUT 和 DELETE,无扩展

    我试图了解 IIS 7 5 如何处理 POST 和 PUT 请求 我正在使用 OpenRasta 框架编写 RESTful 服务 POST 操作可以正常工作 但对同一 URL 的 PUT 操作则不然 它返回如下错误 Detailed Err
  • 如何在64位汇编程序中使用RIP相对寻址?

    如何在 AMD64 架构的 Linux 汇编程序中使用 RIP 相对寻址 我正在寻找一个使用 AMD64 RIP 相对寻址模式的简单示例 Hello world 程序 例如 以下 64 位汇编程序可以正常工作 绝对寻址 text globa
  • 如何创建基于 F# 的 Visual Studio 插件?

    即使安装了 F Visual Studio 2008 可能还有 2010 也仅提供 C VB NET 和 C 的外接程序项目模板 那么 如何创建基于 F 的插件呢 我尝试使用实现 IDTExtensibility2 的新类创建 F 类库项目
  • 将 CSV 导入 Java 中的 SQLite

    我正在开始学习 Java 需要一些帮助 我需要将 CSV 文件导入 SQLite 数据库 我有这个 CSV 阅读器 但我不知道如何将此数据复制到 SQLite 数据库中 import java io BufferedReader impor
  • 有没有一种方法可以将对象强制转换回其原始类型而不指定每种情况?

    我有一个不同类型对象的数组 我使用 BinaryWriter 将每个项目转换为其二进制等效项 以便我可以通过网络发送该结构 我目前正在做类似的事情 for i 0 i