我已将T4脚手架模板复制到我的Visual Studio 2017项目中,以便我可以自定义它们。大多数情况下工作正常。但是Controller.CS.T4中的一行会引起头痛。这条有问题的线需要这样的脚手架才能工作:
var entitySetVar = EntitySetVariable ?? (String.IsNullOrEmpty(entitySetName) ? entitySetName : (entitySetName.Substring(0, length:1).ToLowerInvariant() + entitySetName.Substring(1)));
,必须这样的项目才能建立:
var entitySetVar = EntitySetVariable ?? (String.IsNullOrEmpty(entitySetName) ? entitySetName : (entitySetName.Substring(0, length-1).ToLowerInvariant() + entitySetName.Substring(1)));
注意差异:长度:1 vs length-1
长度:1我立即得到语法错误,但是脚手架正常。
使用长度1,无语法错误,但是脚手架失败说:"编译转换:名称'长度'在当前上下文中不存在在线号码'54'和列号'54'和列号'127'"
有人可以解释正在发生的事情和/或建议修复吗?来回切换正在变老。
,因此要启动操作员:1
和-1
从根本上不是同一件事。:
操作员有点奇怪,我在其中没有太多用途,但我承认它有位置。
当您要将特定参数指定到方法中时,使用:
操作员,例如,我们有一种看起来像这样的方法:
void DoSomething(int numberOne = 0, int numberTwo = 0, int numberThree = 0)
我们想将此方法用于某些东西,但是更改numberThree
的值而不指定numberOne
或numberTwo
,那么可以通过:
操作员来实现这一点:
DoSomething(numberThree: 3);
看看我做了什么?我指定了参数numberThree
,并在数字3
中传递。我也可以做:
dosomething(0,0,3(;
有关此此处的更多信息:
https://learn.microsoft.com/en-us/dotnet/csharp/programmpramming-guide/classes-and-ships-and-scrupts/named-and-ynemed-and-yptional-arguments
-
是一个数学函数,减去
3-1=2
使用变量时,我们必须为一个值分配一个变量名称:
var length = 1
我们使用它之前:
length-1
第二个问题的答案
var entitySetVar = EntitySetVariable ?? (String.IsNullOrEmpty(entitySetName) ? entitySetName : (entitySetName.Substring(0, length-1).ToLowerInvariant() + entitySetName.Substring(1)));
很简单,您尚未设置变量length
值,您可以这样做:
var length = 1;
var entitySetVar = EntitySetVariable ?? (String.IsNullOrEmpty(entitySetName) ? entitySetName : (entitySetName.Substring(0, length-1).ToLowerInvariant() + entitySetName.Substring(1)));
现在应该编译的。
至于第一个示例:
var entitySetVar = EntitySetVariable ?? (String.IsNullOrEmpty(entitySetName) ? entitySetName : (entitySetName.Substring(0, length:1).ToLowerInvariant() + entitySetName.Substring(1)));
应该按原样工作
希望这会有所帮助。
解决方案是使用类似字符串的长度属性:
var entitySetVar = EntitySetVariable ?? (String.IsNullOrEmpty(entitySetName) ? entitySetName : (entitySetName.Substring(0, entitySetName.Length-1).ToLowerInvariant() + entitySetName.Substring(1)));