Automatic INotifyPropertyChanged Implementation through T4 code generation?

后端 未结 3 927
迷失自我
迷失自我 2020-12-06 01:55

I\'m currently working on setting up a new project of mine and was wondering how I could achieve that my ViewModel classes do have INotifyPropertyChanged support while not h

3条回答
  •  爱一瞬间的悲伤
    2020-12-06 02:46

    It should definitely work.

    I'd recommend first writing a base class that implements INotifyPropertyChanged, giving it a protected void OnPropertyChanged(string propertyName) method, making it cache its PropertyChangeEventArgs objects (one per unique property name -- no point in creating a new object every time the event is raised), and have your T4-generated class derive from this base.

    To get the members that need properties implemented, you can just do something like:

    BindingFlags flags = BindingFlags.Instance | BindingFlags.NonPublic;
    FieldInfo[] fieldsNeedingProperties = inputType.GetFields(flags)
        .Where(f => f.Name.StartsWith("p_"))
        .ToArray();
    

    And go from there:

    <# foreach (var field in fieldsNeedingProperties) { #>
    <# string propertyName = GetPropertyName(field.Name); #>
        public <#= field.FieldType.FullName #> <#= propertyName #> {
            get { return <#= field.Name #>; }
            set {
                <#= field.Name #> = value;
                OnPropertyChanged("<#= propertyName #>");
            }
        }
    <# } #>
    
    <#+
        private string GetPropertyName(string fieldName) {
            return fieldName.Substring(2, fieldName.Length - 2);
        }
    #>
    

    And so on.

提交回复
热议问题