1

我正在开发一个 T4 模板,它将基于核心上的实体生成视图模型。例如,我在 Core 中有 News 类,我希望这个模板生成这样的视图模型

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 类属性的方法。我如何使用反射来获取它们和 . . .

4

1 回答 1

2

假设您的“新闻”类与您希望在其中创建视图位于同一个项目中,您有两种可能性:

  1. 构建您的项目,然后使用 <#@ assembly name="$(TargetPath)" #>. 然后你可以在模板中使用标准反射来达到你想要的类。但要小心,你总是在反映你的最后一个可能已经过时和/或包含错误的构建!
  2. 看看有形的 T4 编辑器。它是免费的,并为 T4 模板提供语法高亮 + IntelliSense。它还有一个免费的模板库,其中包含一个名为“tangible VisualStudio Automation Helper”的模板。将此包含到您的模板中,并使用 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"))
            {
                ...
            }
        }
    }
    #>
    

希望有帮助!

于 2013-07-08T12:20:15.613 回答