繁体   English   中英

通过反射设置值不起作用

[英]Setting a value through reflection is not working

我试图通过反思来设定价值。 我创建了这个小测试程序

    struct headerIndexes
    {
        public int AccountNum{ get; set; }
        public int other { get; set; }
        public int items { get; set; }
    }
    static void Main(string[] args)
    {

        headerIndexes headers = new headerIndexes();
        headers.AccountNum = 1;
        Console.WriteLine("Old val: {0}", headers.AccountNum);
        foreach (var s in headers.GetType().GetProperties())
        {
            if (s.Name == "AccountNum")
                s.SetValue(headers, 99, null);
        }
        Console.WriteLine("New val: {0}", headers.AccountNum);
        Console.ReadKey();
    }

在我正确看到它的程序中执行命令s.SetValue(headers, 99, null); 但是,当运行setValue时,headers.AccountNum的值保持为1。

我错过了一个明显的步骤吗?

我认为标题可能会被装入一个新对象,因为它是一个结构,然后一旦SetValue返回,该对象就会收集垃圾。 将其更改为班级,看看问题是否消失。

SetValue期望一个object导致对headers进行装箱操作。 由于headersstruct ,因此它是值类型。 因此,会创建一个副本,您要修改的是盒装对象而不是headers

您应该认真考虑避免使用可变值类型。

来自Eric Lippert

这是可变值类型是邪恶的另一个原因。 尝试始终使值类型不可变。

您也可以使用未装箱的struct版本。
object unboxedHeader = headers;
s.SetValue(unboxedHeader,99,null);

struct headerIndexes 
{ 
    public int AccountNum{ get; set; } 
    public int other { get; set; } 
    public int items { get; set; } 
} 
static void Main(string[] args) 
{ 

    headerIndexes headers = new headerIndexes(); 
    headers.AccountNum = 1; 
    Console.WriteLine("Old val: {0}", headers.AccountNum); 
    object unboxedHeader=headers;
    foreach (var s in headers.GetType().GetProperties()) 
    { 
        if (s.Name == "AccountNum") 
            s.SetValue(unboxedHeader, 99, null); 
    } 
    Console.WriteLine("New val: {0}", headers.AccountNum); 
    Console.ReadKey(); 
} 

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM