gpt4 book ai didi

c# - 对两个相同类型结构的值求和

转载 作者:行者123 更新时间:2023-12-04 10:55:41 29 4
gpt4 key购买 nike

这个问题在这里已经有了答案:





Sum up all the properties of a collection and dynamically assigned it to another object

(3 个回答)



Why doesn't reflection set a property in a Struct?

(3 个回答)


1年前关闭。




所以我有一个这样的结构:

public struct Attributes {
public int vitality;
public int intelligence;
public int dexterity;
public int agility;
}

我像这样使用它:
Attributes a = new Attributes();
Attributes b = new Attributes();

而我想要实现的是:
Attributes c = new Attributes();
c = a + b;

我希望这给我上面指定的这两个 Attributess 的这 4 个变量的总和。

在结构内部,我尝试使用以下方法:
public static Attributes operator +(Attributes x, Attributes y) {
PropertyInfo[] info = typeof(Attributes).GetType().GetProperties();
for (int i = 0; i < info.Length; i++) {
info[i].SetValue(x, (int) info[i].GetValue(x) + (int) info[i].GetValue(y), null);
}

return x;
}

这显然不起作用,给我一个错误。

你们能帮我解决这个问题吗?我能做些什么来实现我想要的?谢谢。

最佳答案

只需使用以下内容:

public static Attributes operator +(Attributes x, Attributes y) {
return new Attributes
{
vitality = x.vitality + y.vitality,
intelligence = x.intelligence + y.intelligence,
dexterity = x.dexterity+ y.dexterity,
agility = x.agility + y.agility
};
}

如果你不需要,没有必要花哨和使用反射。这是一个强大的工具,但不要陷入金锤谬论。仅在真正需要的地方使用它。

编辑:如果你真的想使用反射,这是你的代码的工作版本:
public static Attributes operator +(Attributes x, Attributes y)
{
FieldInfo[] info = typeof(Attributes).GetFields();
object boxedResult = new Attributes();
foreach (FieldInfo fi in info)
{
fi.SetValue(boxedResult, (int)fi.GetValue(x) + (int)fi.GetValue(y));
}

return (Attributes)boxedResult;
}

我认为这需要对我所做的更改进行一些解释:
  • 如果 operator+,我会认为这是不寻常的修改了它的一个操作数,所以我让它返回一个新的 Attributes结构代替。
  • 您调用 typeof(Attributes).GetType()基本上采用了 Attributes 的类型并得到了类型的类型,这绝对不是你想要的。
  • 您正在检查房产信息,但 Attributes没有属性,只有字段。
  • 我明确地将 Attributes 装箱struct 在设置其字段之前。装箱结构会复制它,当您采用值类型(例如任何 struct)并将其强制转换为 object 时,就会发生装箱。 .发生的事情是您的值类型(位于堆栈中)被放入一个整洁的小引用类型框并存储在堆中,因为只有引用类型可以存在于堆中。实际上,它的副本存储在堆上。所以自从 SetValue需要一个 object参数作为“目标”,该结构每次都会被装箱,有效地接受您的更改并将它们应用到副本,然后立即将其丢弃。通过显式装箱,我在结构的同一个副本上进行所有更改,然后在取消装箱后返回该副本。如果 Attributes,则不需要此步骤是一个引用类型。
  • 关于c# - 对两个相同类型结构的值求和,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59220197/

    29 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com