我正在开发一个T4模板,它将根据核心上的实体生成View Models。 例如,我在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类属性的方法。 我怎样才能用反射来得到它们。 。 。
答案 0 :(得分:1)
假设您的“新闻”类位于同一个项目中,您希望在其中创建视图,您有两种可能:
<#@ assembly name="$(TargetPath)" #>
。然后,您可以在模板中使用标准反射来达到所需的类。但要小心,你总是反映你可能已经过时和/或包含错误的最后一个版本!看看有形的T4编辑器。它是免费的,为T4模板提供语法高亮+ IntelliSense。它还有一个免费的模板库,其中包含一个名为“有形的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"))
{
...
}
}
}
#>
希望有所帮助!