C# 使用反射时,为什么不';t值设置是否正确?

C# 使用反射时,为什么不';t值设置是否正确?,c#,reflection,system.reflection,C#,Reflection,System.reflection,我试图使用反射来创建一个结构 以下是我正在使用的代码: using System; using System.Collections.Generic; using System.Linq; using System.Reflection; public interface ISomeInterface { } public struct SomeStruct : ISomeInterface { public int Value; public SomeStruct(in

我试图使用反射来创建一个结构

以下是我正在使用的代码:

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();
    }
}
使用系统;
使用System.Collections.Generic;
使用System.Linq;
运用系统反思;
公共接口
{
}
公共结构SomeStruct:ISomeInterface
{
公共价值观;
公共SomeStruct(int值)
{
价值=价值;
}
}
公共结构过滤器
{
公共SomeStruct SomeStruct;
}
公共类
{
private List someInterfaces=new List();
公共void添加(ISomeInterface someInterface)
{
this.someInterfaces.Add(someInterface);
}
公共TFilter ToFilter(),其中TFilter:struct
{
var filterType=typeof(TFilter);
var filterFields=filterType.GetFields();
var result=Activator.CreateInstance();
foreach(filterFields中的变量filterField)
{
var component=this.someInterfaces.First(s=>s.GetType()==filterField.FieldType);
filterField.SetValue(结果、组件);
}
返回结果;
}
}
班级计划
{
公共静态void Main()
{
var someClass=new someClass();
var someStruct=新的someStruct(10);
添加(someStruct);
var filter=someClass.ToFilter();
//应该返回10,但是返回0,为什么?
Console.WriteLine(filter.SomeStruct.Value);
Console.ReadLine();
}
}
由于某些原因,ToFilter方法的结果返回的结构值不正确。我已经做了几个小时了,我只是不明白发生了什么


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

问题在于这一行:

filterField.SetValue(result, component);
SetValue
方法将
对象
作为第一个参数。但是
结果
的类型是
过滤器
,它是一个
结构
。这会导致将
result
装箱,然后在
SetValue
内设置装箱实例的字段。它对原始的
结果没有影响,并且它的值保持为零

传递结构时应该小心,因为这样的意外行为总是会发生。如果不知道装箱/取消装箱的工作方式以及值类型和引用类型之间的差异,则不应该使用这样的结构


是一个很好的起点。

您没有记录接口,也没有记录SomeClass。在GetFilter方法中还有一些接口。不要让你的读者重新创建你的问题。ISomeInterface是一个空界面,
SomeClass
包含
ISomeInterface
列表和
GetFilter
方法。你的帖子下面有一个编辑链接。使用它。全部完成:)@LarsTech可能也会有帮助。