反射中使用值类型与引用类型的参数的区别

本文通过示例代码展示了在C#中使用FieldInfo的SetValue方法为类和结构体成员变量设置值的过程。特别关注了结构体作为值类型在不同情况下的行为差异,并解释了如何正确处理这些差异。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

程序 :

 public class ClassExample
    {
        public string myString;
    }
    public struct StructExample {
        public string myString;
    }

    public class FieldInfo_SetValue
    {
        public static void Main()
        {

            ClassExample c = new ClassExample();
            StructExample s = new StructExample();
            object o = s;
            ArrayList al = new ArrayList();
            al.Add(s);

            Type cType = c.GetType();
            FieldInfo cFieldInfo = cType.GetField("myString");
            cFieldInfo.SetValue(c, "value");
            Console.WriteLine("ClassExample:" + c.myString);
           
            Type sType = s.GetType();
            FieldInfo sFieldInfo = sType.GetField("myString");
            sFieldInfo.SetValue(s,"value");
            Console.WriteLine("StructExample:" + s.myString);


            sFieldInfo.SetValue(o, "value");
            Console.WriteLine("objectExample:" + ((StructExample)o).myString);
           
            sFieldInfo.SetValue(al[0], "value");
            Console.WriteLine("ArrayList:" + ((StructExample)al[0]).myString);
   
            Console.Read();
        }
    } 

 

结果

ClassExample:value
StructExample:
objectExample:value
ArrayList:value

结果表明在

sFieldInfo.SetValue(s,"value"); ////这儿有个装箱过程setvalue(s,"value")时s被copy了一份

//这样操作的结果是在SetValue另一个StructExample  克隆被设置了值,但传入的值StructExample   s并不会被改变
Console.WriteLine("StructExample:" + s.myString);

s.myString此时还是默认值String.Empty,解决的方法是传入一个引用类型还不是值类型,比如将struct转为object然后传入.或其它任何办法都行

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值