在使用反射设置C#结构/类字段时是否可以避免装箱?

在使用反射设置C#结构/类字段时是否可以避免装箱?,c#,reflection,mono,boxing,C#,Reflection,Mono,Boxing,假设我有一个基本值,我需要使用反射将它赋给某个字段。我确信该字段属于相同的基元值类型 是否可以在不装箱的情况下设置此值 void SetFloat(object o, string name, float val) { var type = o.GetType(); var fld = type.GetField(name); fld.SetValue(o, val /*boxing happens here*/); } 另外,这不是关于延迟,而是关于GC可能的压力。我使用的是Un

假设我有一个基本值,我需要使用反射将它赋给某个字段。我确信该字段属于相同的基元值类型

是否可以在不装箱的情况下设置此值

void SetFloat(object o, string name, float val)
{
  var type = o.GetType();
  var fld = type.GetField(name);
  fld.SetValue(o, val /*boxing happens here*/);
}
另外,这不是关于延迟,而是关于GC可能的压力。我使用的是Unity3D,它使用的是每一个旧的Mono版本,而Mono版本又使用了一个非常不理想的GC实现。每个额外内存分配计数:(


p.p.S我正在构建自己的基于C#的解释器,避免反射似乎几乎是不可能的。

可以使用
字段。SetValueDirect
但缺点是您不能使用IL2CPP,因为它不支持此功能。

据我所知,不,
FieldInfo.SetValue()
只有接受
对象newValue
的重载,因此传递它的任何值类型都将被装箱。使用反射比装箱值所花费的精力要高出几个数量级。装箱值非常快,与设置字段和mally vs.使用反射。这就像是问,当你决定从纽约步行到洛杉矶而不是坐飞机时,是否有办法避免系鞋带。其实,这不是关于速度,而是关于可能的GC压力。我使用的是Unity,它使用的是每一个旧的Mono版本,而它又使用了一个非常非最佳的GC实现。每一个额外的分配都很重要:(@pachanga)为了避免装箱,您尝试执行的任何操作都毫无疑问需要执行的不仅仅是分配一个简单变量,因此会增加GC压力,而不是删除它。您可能能够获得setter方法并将其转换为委托类型。然后正常调用该委托。