我在这里有很多多余的地方,但我不知道怎样才能使它看起来更短。
namespace Notan
{
public class EquipmentSystem : ScriptableObject
{
public UnityEvent onUpdate = new UnityEvent();
[SerializeField] private Weapon weapon1;
public Weapon Weapon1
{
get => weapon1;
private set
{
weapon1 = value;
onUpdate?.Invoke();
}
}
[SerializeField] private Weapon weapon2;
public Weapon Weapon2
{
get => weapon2;
private set
{
weapon2 = value;
onUpdate?.Invoke();
}
}
[SerializeField] private Accessory accessory1;
public Accessory Accessory1
{
get => accessory1;
private set
{
accessory1 = value;
onUpdate?.Invoke();
}
}
[SerializeField] private Accessory accessory2;
public Accessory Accessory2
{
get => accessory2;
private set
{
accessory2 = value;
onUpdate?.Invoke();
}
}
[SerializeField] private Shield shield;
public Shield Shield
{
get => shield;
private set
{
shield = value;
onUpdate?.Invoke();
}
}
[SerializeField] private Armor armor;
public Armor Armor
{
get => armor;
private set
{
armor = value;
onUpdate?.Invoke();
}
}
}
}
```发布于 2021-03-05 21:19:10
您可以通过使用自定义SourceGenerator来减少代码的冗余。它可以像福迪为WPF和INotifyPropertyChanged工作一样。
遗憾的是,我没有提供SourceGenerator的S实现的例子,因为我还没有时间去玩它们。尽管我的想法是让SourceGenerator在编译时为您生成冗余代码,只要它检测到您想要自动生成的东西。
您有两个选项,但都需要自定义属性(S):
我不太熟悉团结,但我唯一关心的是,这个解决方案可能与团结的诡计不兼容,特别是因为SourceGenerators是一个相当新的特性。
PS :如果优化很重要,我建议您编辑设置器,以便只有当属性的值发生变化时才引发事件(例如:用类似于if (myBackingField != value)的东西包装setter )。
https://codereview.stackexchange.com/questions/256676
复制相似问题