如何修改数组中结构体的值

时间:2021-06-24 19:06:18
现在定义了一个结构体TRtuAnalog
  public struct TRtuAnalog
        {
            public string SName;
            public Single fUpLimit; //上限值
            public Single fDownLimit; //下限值
        }
        public static TRtuAnalog tRtuAnalog;

同时定义一个ArrayList 数组
 public static ArrayList[] aRealTime 
        {
            get
            {
                if aRealTime == null)
                    aRealTime = new ArrayList[255];
                return aRealTime 
            }
            set
            {
                if (value == null)
                    throw new aRealTime ("value");
                aRealTime = value;
            }
        }

然后给tRtuAnalog 赋值 
TRtuAnalog.SName="aaa";
TRtuAnalog.fUpLimit=1;
TRtuAnalog.fDownLimit=2;
最后将TRtuAnalog添加到aRealTime 中
aRealTime[iIndex].Add(tRtuAnalog);

请问我如何修改aRealTime中某一行中的SName值为tRtuAnalog.SName="bbbb" 。
我写下面的语句后
((TRtuAnalog)aRealTime[iIndex][index]).SName="bbbb" ;
提示我“无法修改取消装箱转换的结果”.

10 个解决方案

#1


因为结构是值传递,非引用,
((TRtuAnalog)aRealTime[iIndex][index]) 是形成一个临时变量,而非aRealTime内部结构的本身,所以你修改这个临时变量是没有用的,因此出错

反射
or 
利用接口

#2


难道我没看懂?

((TRtuAnalog)(aRealTime[iIndex])).SName = "bbb";//不是这样的?

#3


具体的该怎么做?我现在是不会了:(

#4


jiatong1981(末日之痕)  , 不是这样的。至少我这边这样写报错!hdt(倦怠)说得有道理,但我就是不会做

#5


对数据里的结构体值,应该用一个新的结构体设置好值后再给到数据,而不是直接修改数组里的结构体。

#6


关注

#7


interface yourinterface
{
  string Name{
    get;
    set;
  }
 .....
}
 public struct TRtuAnalog:yourinterface
        {
            string SName;
            Single fUpLimit; //上限值
            Single fDownLimit; //下限值
            public Name{
               get{
                  ...
               }
               set{
                    SName = value;
               }
            }
        }
 yourinterface yi =aRealTime[iIndex] as  yourinterface;
  yi.Name = "xxxx"

#8


我怎么觉得应该是如下的方式呢?因为结构体是值类型,不能通过引用修改吧...


TRtuAnalog tmp = (TRtuAnalog)aRealTime[iIndex][index];
tmp.SName="bbbb" ;

aRealTime[iIndex][index]=tmp;

#9


ls方法也可以但有一个小问题
如果结构的成员比较到,需要重复输入,比较麻烦

#10


sorry 上面错了

#1


因为结构是值传递,非引用,
((TRtuAnalog)aRealTime[iIndex][index]) 是形成一个临时变量,而非aRealTime内部结构的本身,所以你修改这个临时变量是没有用的,因此出错

反射
or 
利用接口

#2


难道我没看懂?

((TRtuAnalog)(aRealTime[iIndex])).SName = "bbb";//不是这样的?

#3


具体的该怎么做?我现在是不会了:(

#4


jiatong1981(末日之痕)  , 不是这样的。至少我这边这样写报错!hdt(倦怠)说得有道理,但我就是不会做

#5


对数据里的结构体值,应该用一个新的结构体设置好值后再给到数据,而不是直接修改数组里的结构体。

#6


关注

#7


interface yourinterface
{
  string Name{
    get;
    set;
  }
 .....
}
 public struct TRtuAnalog:yourinterface
        {
            string SName;
            Single fUpLimit; //上限值
            Single fDownLimit; //下限值
            public Name{
               get{
                  ...
               }
               set{
                    SName = value;
               }
            }
        }
 yourinterface yi =aRealTime[iIndex] as  yourinterface;
  yi.Name = "xxxx"

#8


我怎么觉得应该是如下的方式呢?因为结构体是值类型,不能通过引用修改吧...


TRtuAnalog tmp = (TRtuAnalog)aRealTime[iIndex][index];
tmp.SName="bbbb" ;

aRealTime[iIndex][index]=tmp;

#9


ls方法也可以但有一个小问题
如果结构的成员比较到,需要重复输入,比较麻烦

#10


sorry 上面错了