【问题标题】:Get class properties in t4 template (vs2015)在 t4 模板中获取类属性(vs2015)
【发布时间】:2018-06-19 18:38:59
【问题描述】:

使用 VS2015,我正在修改控制器和视图脚手架的默认 t4 模板。在此模板中,我可以直接访问相关模型的属性,但我还需要获取与模板位于同一项目中的类的属性。我在 t4 模板的顶部添加了这个:

<#@ Assembly Name="C:\_code\MyProject\obj\Debug\MyProject.dll" #>
<#@ import namespace="MyProject.Models.Filtros" #>

然后我可以得到类的属性

var listPropsFiltro = typeof(FiltroClientes).GetProperties().Select(f => f.Name).ToList();

这工作正常。

现在我的问题是,我不必在代码中编写类的名称(例如,FiltroClientes),而是必须使用类似的东西来构造它

var classname = "Filtro" + ControllerRootName;

当然这是行不通的:

var listPropsFiltro = typeof(classname).GetProperties().Select(f => f.Name).ToList();

我在 stackexchange 和其他地方发现了一些关于类似情况的帖子,但没有一个解决方案对我有用...... 那么这样做的正确方法应该是什么?

【问题讨论】:

  • 是的 typeof(classname) 应该是 System.String ...没有帮助。如果您已经在加载程序集,为什么不加载您所在的项目,然后从中获取类型?当然,您必须重建它才能获得最新的结果,但应该不会太麻烦。

标签: c# .net t4 system.type


【解决方案1】:

你可以使用:

Type classType = Assembly.GetType(classname)

然后打电话

var listPropsFiltro = classType.GetProperties().Select(f =&gt; f.Name).ToList();

您可以尝试通过以下方式获取当前程序集:

Assembly.GetExecutingAssembly()

如果您执行的程序集不等于包含您的类的项目程序集,您可以这样做。

Assembly project Assembly = Assembly.LoadFrom(pathToProject)

msdn

【讨论】:

  • 我试过了,但是脚手架时报错:非静态字段、方法或属性'Assembly.GetType(string)'需要对象引用
  • 这里的问题是这段代码在一个 t4 模板中,并且 t4 模板(据我所知)总是独立的(与任何项目或解决方案无关)。因此 getExecutingAssembly() 方法返回一个临时程序集。 (即string s = Assembly.GetExecutingAssembly().FullName 返回类似TemporaryT4Assembly, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null
  • 仍然无法正常工作。它在Type classType = projectassembly.GetType(classname); 行失败,带有An expression block evaluated as Null System.ArgumentNullException: Value cannot be null at Microsoft.VisualStudio.TextTemplating.ToStringHelper.ToStringWithCulture(Object objectToConvert)
  • 你使用的是 nameof(classname) 还是类似的东西?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-01-28
  • 1970-01-01
  • 1970-01-01
  • 2014-04-04
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多