.Net T4 模板 实例(一)

T4模板基础就不在这里重复了,园子里有很多文章讲解T4模板。

今天给大家介绍一个实例 主要是针对WPF MVVM中Model的书写,

Model的格式大致是:

    // 测试
    private string a;

    /// <summary>
    /// 测试
    /// <summary>
    public string A
    {
        get 
        { 
            return a;
        }
        set
        {
            if (a != value)
            {
                a = value;
                this.RaisePropertyChanged("A");
            }
        }
    }

在Model 类中一般都是重复性质的工作,所有选择T4来生成该文件是个不错的选择。

生成model的核心代码如下:

BaseModelT4.tt

<#@ template language="C#" #>
<#@ assembly name="System.Core" #>
<#@ import namespace="System.Linq" #>
<#@ import namespace="System.Text" #>
<#@ import namespace="MVVMT4.models" #>
<#@ import namespace="System.Collections.Generic" #>
<#@ include file="BaseT4.tt" #>
<#foreach(ModelT4Model item in ModelT4OC) 
{
#>

    // <#=item.Notes#>
    private <#=item.TypeName#> <#=Lower(item.PropertyName) #>;

    /// <summary>
    /// <#=item.Notes#>
    /// <summary>
    public <#=item.TypeName #> <#=Uppercase(item.PropertyName) #>
    {
        get 
        { 
            return <#=Lower(item.PropertyName) #>;
        }
        set
        {
            if (<#=Lower(item.PropertyName) #> != value)
            {
                <#=Lower(item.PropertyName) #> = value;
                this.RaisePropertyChanged("<#=Uppercase(item.PropertyName) #>");
            }
        }
    }
<#}#>

BaseModelT4_P.cs

public partial class BaseModelT4
    {
        #region 字段

        private ObservableCollection<ModelT4Model> _ModelT4OC = new ObservableCollection<ModelT4Model>();

        #endregion

        #region 属性

        public ObservableCollection<ModelT4Model> ModelT4OC
        {
            get { return _ModelT4OC; }
            set { _ModelT4OC = value; }
        }

        #endregion
    }

BaseT4.tt

<#@ template debug="false" hostspecific="false" language="C#" #>
<#@ assembly name="System.Core" #>
<#@ import namespace="System.Linq" #>
<#@ import namespace="System.Text" #>
<#@ import namespace="System.Collections.Generic" #>
<#@ output extension=".txt" #>
<#+public string Uppercase(string s)
    {
        if(string.IsNullOrEmpty(s))
        {
            return string.Empty;
        }

        string notConvertS = s.Substring(1);
        string convertS=s.Substring(0,1);
        convertS = convertS.ToUpperInvariant();
        return convertS + notConvertS;
    }
    public string Lower(string s)
    {
        if(string.IsNullOrEmpty(s))
        {
            return string.Empty;
        }

        string notConvertS = s.Substring(1);
        string convertS=s.Substring(0,1);
        convertS = convertS.ToLowerInvariant();
        return convertS + notConvertS;
    }
#>
ModelT4Model.cs

public class ModelT4Model : INotifyPropertyChanged
    {
        #region 字段

        private string _TypeName = string.Empty;
        private string _PropertyName = string.Empty;
        //注释
        private string _Notes = string.Empty;

        #endregion

        #region 属性

        public string TypeName
        {
            get { return _TypeName; }
            set
            {
                if (_TypeName != value)
                {
                    _TypeName = value;
                    OnPropertyChanged("TypeName");
                }
            }
        }

        public string PropertyName
        {
            get { return _PropertyName; }
            set
            {
                if (_PropertyName != value)
                {
                    _PropertyName = value;
                    OnPropertyChanged("PropertyName");
                }
            }
        }

        /// <summary>
        /// 注释
        /// </summary>
        public string Notes
        {
            get { return _Notes; }
            set
            {
                if (_Notes != value)
                {
                    _Notes = value;
                    OnPropertyChanged("Notes");
                }
            }
        }

        #endregion

        #region 方法

        private void OnPropertyChanged(string propertyName)
        {
            if (PropertyChanged != null)
            {
                PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
            }
        }

        #endregion

        #region 事件

        public event PropertyChangedEventHandler PropertyChanged;

        #endregion
    }


源码下载

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。