我想写一个方法,它接受一个字段名和一个新值

  • 本文关键字:一个 字段 新值 方法 c#
  • 更新时间 :
  • 英文 :


这里有什么问题?由于某些原因,方法EditInfo不改变变量的值。

struct Address
{
public string id;
public string addressline;
public string postalcode;
public Address(string[] data)
{
this.id = data[0];
this.addressline = data[1];
this.postalcode = data[2];
}
public void EditInfo(string field, string newdata)
{
Type myType = typeof(Address);
myType.GetField(field).SetValue(this, newdata);
}
}

通过反射来更新结构体是很棘手的,因为您通常使用的是一个立即丢失的装箱值。更多的信息请看这个答案。

在这种情况下,最简单的修复方法是将结构体更改为类,然后原始代码就可以工作了。

但是如果你坚持使用结构体,你需要使用未记录的__makeref和使用SetValueDirect的类型引用更新,像这样:

public void EditInfo(string field, string newdata)
{
Type myType = typeof(Address);
var fieldInfo = myType.GetField(field);
var reference = __makeref(this);
fieldInfo.SetValueDirect(reference, newdata);
}

一个解决方案是完全避免反射(当然真正的解决方案是避免使用可变值类型)。用这个替换EditInfo似乎可以工作:

public void EditInfo(string field, string newdata)
{
switch (field)
{
case nameof(id):
id = newdata;
break;
case nameof(addressline):
addressline = newdata;
break;
case nameof(postalcode):
postalcode = newdata;
break;
default:
throw new Exception("oops");
}
}

您正在按名称进行字段查找,因此这可能是相同数量的工作,但没有反射的抽象和装箱/拆箱开销。

只是一个想法

最新更新