【问题标题】:When using reflection, why aren't values being set correctly? [duplicate]使用反射时,为什么没有正确设置值? [复制]
【发布时间】:2018-09-10 20:10:53
【问题描述】:

我正在尝试使用反射来创建结构

这是我正在使用的代码:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Reflection;

public interface ISomeInterface
{

}

public struct SomeStruct : ISomeInterface
{
    public int Value;

    public SomeStruct(int value)
    {
        Value = value;
    }
}

public struct Filter
{
    public SomeStruct SomeStruct;
}

public class SomeClass
{
    private List<ISomeInterface> someInterfaces = new List<ISomeInterface>();

    public void Add(ISomeInterface someInterface)
    {
        this.someInterfaces.Add(someInterface);
    }

    public TFilter ToFilter<TFilter>() where TFilter : struct
    {
        var filterType = typeof(TFilter);
        var filterFields = filterType.GetFields();

        var result = Activator.CreateInstance<TFilter>();

        foreach (var filterField in filterFields)
        {
            var component = this.someInterfaces.First(s => s.GetType() == filterField.FieldType);

            filterField.SetValue(result, component);
        }

        return result;
    }
}

class Program
{
    public static void Main()
    {
        var someClass = new SomeClass();

        var someStruct = new SomeStruct(10);
        someClass.Add(someStruct);

        var filter = someClass.ToFilter<Filter>();

        // Should return 10, but returns 0, why?
        Console.WriteLine(filter.SomeStruct.Value);

        Console.ReadLine();
    }
}

由于某种原因,ToFilter 方法的结果返回了一个值不正确的结构。我已经做了好几个小时了,我就是不明白发生了什么。

这让我沮丧了几个小时,如果有人可以帮助我,将不胜感激。

【问题讨论】:

  • 您没有记录您的界面,也没有记录您的 SomeClass。 GetFilter 方法中还有一些接口。不要让你的听众努力重现你的问题。
  • ISomeInterface 是一个空接口,SomeClass 包含ISomeInterfacesGetFilter 方法的列表。
  • 您的帖子下方有一个编辑链接。使用它。
  • 全部完成 :) @LarsTech

标签: c# reflection system.reflection


【解决方案1】:

问题出在这一行:

filterField.SetValue(result, component);

SetValue 方法将object 作为它的第一个参数。但是result 的类型为Filter,即struct。这会导致result 被装箱,然后在SetValue 内设置装箱实例 的字段。这对原始的result 没有影响,它的值保持为零。

在传递结构时应该小心,因为这样的意外行为总是会发生。如果您不了解装箱/拆箱的工作原理以及值类型和引用类型之间的区别,则不应使用这样的结构。

Here 是一个很好的起点。

【讨论】:

猜你喜欢
  • 2023-03-11
  • 2015-12-23
  • 2014-02-25
  • 2014-08-05
  • 1970-01-01
  • 2021-01-12
  • 2015-10-30
  • 1970-01-01
  • 2010-09-26
相关资源
最近更新 更多