代码之家  ›  专栏  ›  技术社区  ›  benPearce

在C中自动实现的属性#

  •  12
  • benPearce  · 技术社区  · 16 年前

    是否有方法在引发变更事件的同时继续使用自动实现的属性,例如 InotifyProperty已更改 ,何时调用set?

    而不是:

    private string _value;
    public string Value
    {
      get 
      { 
        return this._value;
      }
      set
      {
        this._value = value;
        this.ValueChanged(this,EventArgs.Empty);
      }
    }
    

    我可以这样做吗:

    public string Value 
    { 
       get; 
       set 
       { 
         this.ValueChanged(this,EventArgs.Empty); 
       }
    }
    

    尽管setter看起来不正确,但在不使用后备存储变量填充类的情况下,是否可以这样做?

    更新:看起来对于我懒惰的目标没有标准的解决方案,我认为最好的解决方案是使用coderush或resharper为我生成所有的后备存储。

    8 回复  |  直到 10 年前
        1
  •  6
  •   womp    16 年前

    你不能这样做。自动实现属性的规范非常清楚:

    自动实现 (自动实现)属性自动 这种模式。更具体地说, 非抽象属性声明是 允许使用分号访问器 身体。两个访问器都必须存在 两者都必须有分号体, 但是他们可以有不同的 可访问性修饰符。当A 属性的指定方式如下: 支持字段将自动 为该属性生成,并且 访问器将实现为读取 从那个支持字段开始并写入。 支持字段的名称为 编译器生成并无法访问 用户。

    换句话说,他们只能 get; “和” set; “,可以使用访问修饰符。

        2
  •  4
  •   Arsen Mkrtchyan    16 年前

    不,您不能,因为您没有访问为该属性生成的私有字段的权限

        3
  •  4
  •   Rob Windsor    16 年前

    在谷歌上快速搜索“inotifypropertieschanged auto properties”,你会看到一些关于这个主题的博客文章和文章。这是一个:

    INotifyPropertyChanged auto wiring or how to get rid of redundant code

        4
  •  1
  •   Timothy Walters    16 年前

    有人问过C 3.0背后的微软团队,他们说他们会考虑这个问题,读过 here .

    在评论中,你会发现更多的信息,包括如果你需要更多的控制,为什么这是一个坏主意,以及实现它的方法。

        5
  •  1
  •   gimalay    16 年前

    您可以使用一些AOP框架,比如 PostSharp .

    但它可以降低性能和构建时间。

        6
  •  1
  •   benPearce    10 年前

    自从我问这个问题以来,这个问题实际上已经作为一个属性和构建任务解决了: https://github.com/demigor/kindofmagic

        7
  •  0
  •   Ali Shams    12 年前

    这种行为可以通过代理工厂类型的生成器来完成。我已经在我的开发框架中完成了这项工作。如果使用System.Reflection.Emit,则可以创建类型代理。 请考虑以下示例:

    var a = Proxier<InputType>.CreateInstance(new object[] { }); // object arrays are for different constructors
    a.PropertyAccessed += ...
    
        8
  •  0
  •   wimh    10 年前

    FoDY插件 PropertyChanged 做这个。就像 KindOfMagic ,fody使用mono.cecil在编译时修改.NET程序集的IL。以下示例列在PropertyChanged文档中:

    你写:

    [ImplementPropertyChanged]
    public class Person 
    {        
        public string GivenNames { get; set; }
        public string FamilyName { get; set; }
    
        public string FullName
        {
            get
            {
                return string.Format("{0} {1}", GivenNames, FamilyName);
            }
        }
    }
    

    编译内容:

    public class Person : INotifyPropertyChanged
    {
        public event PropertyChangedEventHandler PropertyChanged;
    
        string givenNames;
        public string GivenNames
        {
            get { return givenNames; }
            set
            {
                if (value != givenNames)
                {
                    givenNames = value;
                    OnPropertyChanged("GivenNames");
                    OnPropertyChanged("FullName");
                }
            }
        }
    
        string familyName;
        public string FamilyName
        {
            get { return familyName; }
            set 
            {
                if (value != familyName)
                {
                    familyName = value;
                    OnPropertyChanged("FamilyName");
                    OnPropertyChanged("FullName");
                }
            }
        }
    
        public string FullName
        {
            get
            {
                return string.Format("{0} {1}", GivenNames, FamilyName);
            }
        }
    
        public virtual void OnPropertyChanged(string propertyName)
        {
            var propertyChanged = PropertyChanged;
            if (propertyChanged != null)
            {
                propertyChanged(this, new PropertyChangedEventArgs(propertyName));
            }
        }
    }
    

    这个 wiki 包括一些更高级的示例。

    可使用Nuget:

    PM> Install-Package PropertyChanged.Fody
    
    推荐文章