C# 有没有类似this的简化代码的功能?

陌上_桑 2019-05-18 08:14:28
代码中的引用太多了,能不能简化代码?
...全文
68 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
threenewbee 2019-05-18
  • 打赏
  • 举报
回复
[MarshalAsAttribute(UnmanagedType.ByValArray, SizeConst = 32, ArraySubType = UnmanagedType.Struct)] public bool[] bit;
陌上_桑 2019-05-18
  • 打赏
  • 举报
回复
还有一个就是

[StructLayout(LayoutKind.Explicit)]
    public struct Union
    {
        [FieldOffset(0)]
        public bool bit0;
        [FieldOffset(1)]
        public bool bit1;
        [FieldOffset(2)]
        public bool bit2;
        [FieldOffset(3)]
        public bool bit3;
        [FieldOffset(4)]
        public bool bit4;
        [FieldOffset(5)]
        public bool bit5;
        [FieldOffset(6)]
        public bool bit6;
        [FieldOffset(7)]
        public bool bit7;
        [FieldOffset(8)]
        public bool bit8;
        [FieldOffset(9)]
        public bool bit9;
        [FieldOffset(10)]
        public bool bit10;
        [FieldOffset(11)]
        public bool bit11;
        [FieldOffset(12)]
        public bool bit12;
        [FieldOffset(13)]
        public bool bit13;
        [FieldOffset(14)]
        public bool bit14;
        [FieldOffset(15)]
        public bool bit15;
        [FieldOffset(16)]
        public bool bit16;
        [FieldOffset(17)]
        public bool bit17;
        [FieldOffset(18)]
        public bool bit18;
        [FieldOffset(19)]
        public bool bit19;
        [FieldOffset(20)]
        public bool bit20;
        [FieldOffset(21)]
        public bool bit21;
        [FieldOffset(22)]
        public bool bit22;
        [FieldOffset(23)]
        public bool bit23;
        [FieldOffset(24)]
        public bool bit24;
        [FieldOffset(25)]
        public bool bit25;
        [FieldOffset(26)]
        public bool bit26;
        [FieldOffset(27)]
        public bool bit27;
        [FieldOffset(28)]
        public bool bit28;
        [FieldOffset(29)]
        public bool bit29;
        [FieldOffset(30)]
        public bool bit30;
        [FieldOffset(31)]
        public bool bit31;
         
        [FieldOffset(0)]
        public int BitComb;
         
         
    }
这里的

 [FieldOffset(0)]
        public bool bit0;
        [FieldOffset(1)]
        public bool bit1;
        [FieldOffset(2)]
        public bool bit2;
        [FieldOffset(3)]
        public bool bit3;
        [FieldOffset(4)]
        public bool bit4;
        [FieldOffset(5)]
        public bool bit5;
        [FieldOffset(6)]
        public bool bit6;
        [FieldOffset(7)]
        public bool bit7;
        [FieldOffset(8)]
        public bool bit8;
        [FieldOffset(9)]
        public bool bit9;
        [FieldOffset(10)]
        public bool bit10;
        [FieldOffset(11)]
        public bool bit11;
        [FieldOffset(12)]
        public bool bit12;
        [FieldOffset(13)]
        public bool bit13;
        [FieldOffset(14)]
        public bool bit14;
        [FieldOffset(15)]
        public bool bit15;
        [FieldOffset(16)]
        public bool bit16;
        [FieldOffset(17)]
        public bool bit17;
        [FieldOffset(18)]
        public bool bit18;
        [FieldOffset(19)]
        public bool bit19;
        [FieldOffset(20)]
        public bool bit20;
        [FieldOffset(21)]
        public bool bit21;
        [FieldOffset(22)]
        public bool bit22;
        [FieldOffset(23)]
        public bool bit23;
        [FieldOffset(24)]
        public bool bit24;
        [FieldOffset(25)]
        public bool bit25;
        [FieldOffset(26)]
        public bool bit26;
        [FieldOffset(27)]
        public bool bit27;
        [FieldOffset(28)]
        public bool bit28;
        [FieldOffset(29)]
        public bool bit29;
        [FieldOffset(30)]
        public bool bit30;
        [FieldOffset(31)]
        public bool bit31;
能不能想办法简化? 类似于(当然这是错误的)

[StructLayout(LayoutKind.Explicit)]
    public struct Union
    {
        [FieldOffset(0)]
        public bool[32] bit;        
         
        [FieldOffset(0)]
        public int BitComb;
         
         
    }
这样很简洁啊。 定义成Class?
陌上_桑 2019-05-18
  • 打赏
  • 举报
回复
大佬们来支持一下啊,多谢!!!
陌上_桑 2019-05-18
  • 打赏
  • 举报
回复
原因还是因为是.NET CF开发,这里不知道很多变量的完整路径。

namespace Neo.ApplicationFramework.Generated
{
    using System.Windows.Forms;
    using System;
    using System.Drawing;
	using System.Runtime.InteropServices;
    using Neo.ApplicationFramework.Tools;
    using Neo.ApplicationFramework.Common.Graphics.Logic;
    using Neo.ApplicationFramework.Controls;
    using Neo.ApplicationFramework.Interfaces;
	
	//add related quotation
	using System.IO;
	using System.Reflection;
	
	//using Neo.ApplicationFramework.Interfaces.Constants;
	
	
    
	public class DeviceInfo
	{
		public float[] wrSV_float = new float[3];
		public int[] wrSV_int = new int[4];
		public string[] wrPW = new string[3];
		public bool[] wBTN = new bool[3];
		
		/// <summary>
		/// the followings are just for reads
		/// </summary>
		public float[] rCV_float = new float[4];
		public int[] rCV_int = new int[4];
		public bool[] rLP = new bool[3];
		public bool[] rSIG = new bool[2];
		//
		public int execution ()
		{
			int exe = 0;
			int[] bool2int = {0,0};
			bool[] sig = this.rSIG;
			bool2int[0] = Convert.ToInt16(sig[0]);
			bool2int[1] = Convert.ToInt16(sig[1]);
			exe |= bool2int[0];
			exe |= (bool2int[1])<<1;
			return exe;
		}
	}
	[StructLayout(LayoutKind.Explicit)]
	public struct Union
	{
		[FieldOffset(0)]
		public bool bit0;
		[FieldOffset(1)]
		public bool bit1;
		[FieldOffset(2)]
		public bool bit2;
		[FieldOffset(3)]
		public bool bit3;
		[FieldOffset(4)]
		public bool bit4;
		[FieldOffset(5)]
		public bool bit5;
		[FieldOffset(6)]
		public bool bit6;
		[FieldOffset(7)]
		public bool bit7;
		[FieldOffset(8)]
		public bool bit8;
		[FieldOffset(9)]
		public bool bit9;
		[FieldOffset(10)]
		public bool bit10;
		[FieldOffset(11)]
		public bool bit11;
		[FieldOffset(12)]
		public bool bit12;
		[FieldOffset(13)]
		public bool bit13;
		[FieldOffset(14)]
		public bool bit14;
		[FieldOffset(15)]
		public bool bit15;
		[FieldOffset(16)]
		public bool bit16;
		[FieldOffset(17)]
		public bool bit17;
		[FieldOffset(18)]
		public bool bit18;
		[FieldOffset(19)]
		public bool bit19;
		[FieldOffset(20)]
		public bool bit20;
		[FieldOffset(21)]
		public bool bit21;
		[FieldOffset(22)]
		public bool bit22;
		[FieldOffset(23)]
		public bool bit23;
		[FieldOffset(24)]
		public bool bit24;
		[FieldOffset(25)]
		public bool bit25;
		[FieldOffset(26)]
		public bool bit26;
		[FieldOffset(27)]
		public bool bit27;
		[FieldOffset(28)]
		public bool bit28;
		[FieldOffset(29)]
		public bool bit29;
		[FieldOffset(30)]
		public bool bit30;
		[FieldOffset(31)]
		public bool bit31;
		
		[FieldOffset(0)]
		public int BitComb;
		
		
	}
		public void DataRead(Union type1,Union type2)
		{
			int cur_Node = Globals.Tags.addr_node.Value;
			switch(cur_Node)
			{
				case 1:
					//pressure set value read
					if (type1.bit0)
					{
						if (type2.bit0)
							Globals.Tags.sv_prepressure801.Read();
						if (type2.bit1)
							Globals.Tags.sv_brushpressure801.Read();
						if (type2.bit2)
							Globals.Tags.sv_postpressure801.Read();
					}
							
					//counter & time set value read
					Globals.Tags.sv_brushcnt801.Read();
					Globals.Tags.sv_pretime801.Read();
					Globals.Tags.sv_brushtime801.Read();
					Globals.Tags.sv_posttime801.Read();
							
					//password set value read
					Globals.Tags.pw801_Admin.Read();
					Globals.Tags.pw801_Eng.Read();
					Globals.Tags.pw801_Oper.Read();
						
					// button trig read
					Globals.Tags.btn_prepurge801.Read();
					Globals.Tags.btn_brush801.Read();
					Globals.Tags.btn_postpurge801.Read();
						
					//current parameter read
					Globals.Tags.cv_pressure801.Read();
					Globals.Tags.cv_flowm801.Read();
					Globals.Tags.cv_flowb801.Read();
					Globals.Tags.cv_sound801.Read();
							
					//cycle count and time current value read
					Globals.Tags.cv_brushcnt801.Read();
					Globals.Tags.cv_pretime801.Read();
					Globals.Tags.cv_brushtime801.Read();
					Globals.Tags.cv_posttime801.Read();
						
					//button lamp read
					Globals.Tags.lp_prepurge801.Read();
					Globals.Tags.lp_brush801.Read();
					Globals.Tags.lp_postpurge801.Read();
						
					//signal read
					Globals.Tags.sig_purge801.Read();
					Globals.Tags.sig_brush801.Read();					
					break;
				default:
					break;
			}
		}
    }
}
如上所示: 1.Globals.Tags能否定义成一个简单的字符进行引用? 2.这个Globals.Tags.*****这个完整的变量能否定义成字符串进行引用?比方说直接定义好字符串然后就可以使用Read(); 3.Globals.Tags是不是应该属于哪个命名空间?我用using Globals.Tags会报错。 主要是简化代码。 还有一个问题就是,不知道有谁做过不同设备间Ethernet/IP的网络开发? 题注里面的Globals.Tags.*****这些变量都是本设备定义的变量,然后关联到了其他设备的标签地址。 有没有什么方法能直接引用目标设备的标签地址,因为标签在目标设备中是结构体,而需要定义到的本地的Globals是不支持结构体的。
陌上_桑 2019-05-18
  • 打赏
  • 举报
回复
引用 4 楼 caozhy 的回复:
[MarshalAsAttribute(UnmanagedType.ByValArray, SizeConst = 32, ArraySubType = UnmanagedType.Struct)] public bool[] bit;
啥意思?没看懂

110,536

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧