使用反射时,为什么没有正确设置值?
When using reflection, why aren't values being set correctly?
我正在尝试使用反射来创建结构
这是我使用的代码:
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 方法的结果 returns 结构具有不正确的值。我已经在这里待了几个小时了,我只是不明白发生了什么。
几个小时以来我一直很沮丧,如果有人能帮助我,我将不胜感激。
问题出在这一行:
filterField.SetValue(result, component);
SetValue
方法将 object
作为第一个参数。但是 result
是 Filter
类型,它是 struct
。这导致 result
被装箱,然后在 SetValue
内设置 装箱实例 的字段。这对原始 result
没有影响,它的值仍然为零。
传递结构时要小心,因为像这样的意外行为总是会发生。如果您不知道 boxing/unboxing 的工作原理以及值类型和引用类型之间的区别,则不应使用这样的结构。
Here 是一个很好的起点。
我正在尝试使用反射来创建结构
这是我使用的代码:
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 方法的结果 returns 结构具有不正确的值。我已经在这里待了几个小时了,我只是不明白发生了什么。
几个小时以来我一直很沮丧,如果有人能帮助我,我将不胜感激。
问题出在这一行:
filterField.SetValue(result, component);
SetValue
方法将 object
作为第一个参数。但是 result
是 Filter
类型,它是 struct
。这导致 result
被装箱,然后在 SetValue
内设置 装箱实例 的字段。这对原始 result
没有影响,它的值仍然为零。
传递结构时要小心,因为像这样的意外行为总是会发生。如果您不知道 boxing/unboxing 的工作原理以及值类型和引用类型之间的区别,则不应使用这样的结构。
Here 是一个很好的起点。