首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >消除类似属性中的冗余

消除类似属性中的冗余
EN

Code Review用户
提问于 2021-03-03 11:11:42
回答 1查看 124关注 0票数 3

我在这里有很多多余的地方,但我不知道怎样才能使它看起来更短。

代码语言:javascript
复制
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();
            }
        }

    }
}
```
代码语言:javascript
复制
EN

回答 1

Code Review用户

发布于 2021-03-05 21:19:10

您可以通过使用自定义SourceGenerator来减少代码的冗余。它可以像福迪为WPF和INotifyPropertyChanged工作一样。

遗憾的是,我没有提供SourceGenerator的S实现的例子,因为我还没有时间去玩它们。尽管我的想法是让SourceGenerator在编译时为您生成冗余代码,只要它检测到您想要自动生成的东西。

您有两个选项,但都需要自定义属性(S):

  • 让它像白名单一样工作:默认情况下不要自动生成,只有在属性标记为属性时才自动生成。然后将属性(或字段)还原为MyAutoGenerationAttribute公共对象MyProperty { get;set;}
  • 让它像黑名单一样工作(像Fody那样):默认情况下总是自动生成,当属性标记为属性时不要自动生成。

我不太熟悉团结,但我唯一关心的是,这个解决方案可能与团结的诡计不兼容,特别是因为SourceGenerators是一个相当新的特性。

PS :如果优化很重要,我建议您编辑设置器,以便只有当属性的值发生变化时才引发事件(例如:用类似于if (myBackingField != value)的东西包装setter )。

票数 0
EN
页面原文内容由Code Review提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://codereview.stackexchange.com/questions/256676

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档