2013-07-05 114 views
0

我正在研究一个基于核心实体生成视图模型的T4模板。 比如我有核心新闻类,我想这个模板来生成视图模型,如这些在mvc4中读取类属性T4模板

public class News 
{ 
    public property int Id {get;set;} 
    public property string Title {get;set;} 
    public property string Content {get;set;} 
} 

public class NewsCreate 
{ 
    public property int Id {get;set;} 
    public property string Title {get;set;} 
    public property string Content {get;set;} 
} 
public class NewsUpdate 
{ 
    public property int Id {get;set;} 
    public property string Title {get;set;} 
    public property string Content {get;set;} 
} 

现在只是这两个。但我找不到获得News类属性的方法。我如何使用反射来获取它们。 。 。

回答

1

假设你的“新闻”类所在,只要你想创建你的意见,你有两种可能性同一项目内:

  1. 生成项目,然后引用输出装配在T4模板使用 <#@ assembly name="$(TargetPath)" #>。然后你可以在模板中使用标准反射来达到你想要的类。但要小心,你总是反映你的最后一个版本,可能已经过时和/或包含错误!
  2. 看看有形的T4编辑器。它是免费的,并提供语法突出显示+针对T4模板的IntelliSense。它还有一个免费的模板库,其中包含一个名为“有形VisualStudio自动化助手”的模板。 包含这一个到您的模板,并使用Visual Studio代码模型迭代是当前解决方案中的所有类:

    <# var project = VisualStudioHelper.CurrentProject; 
    
    // get all class items from the code model 
    var allClasses = VisualStudioHelper.GetAllCodeElementsOfType(project.CodeModel.CodeElements, EnvDTE.vsCMElement.vsCMElementClass, false); 
    
    // iterate all classes 
    foreach(EnvDTE.CodeClass codeClass in allClasses) 
    { 
        // iterate all properties 
        var allProperties = VisualStudioHelper.GetAllCodeElementsOfType(codeClass.Members, EnvDTE.vsCMElement.vsCMElementProperty, true); 
        foreach(EnvDTE.CodeProperty property in allProperties) 
        { 
         // check if it is decorated with an "Input"-Attribute 
         if (property.Attributes.OfType<EnvDTE.CodeAttribute>().Any(a => a.FullName == "Input")) 
         { 
          ... 
         } 
        } 
    } 
    #> 
    

希望帮助!供参考;

+0

供参考;还有roslyn,它可以为此使用text =>语法树转换。您也可以在T4中定义新闻的模型,并从中避免使用外部工具或反射来生成所有变体。 – FuleSnabel