自定义 Controller.cs.t4 仅在错误时有效
Custom Controller.cs.t4 only works when wrong
我已将 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)));
注意区别:length:1 vs length-1
使用 length:1 我立即收到语法错误,但脚手架工作正常。
长度为 1,没有语法错误,但脚手架失败说:"Compiling transformation: The name 'length' does not exist in the current context' at line number '54' and column number '127'"
有人可以解释发生了什么事 and/or 建议修复吗?来回切换是变老了。
所以要启动运算符 :1
和 -1
从根本上说 不是 同一件事。
:
运算符有点奇怪,我没有发现它有多大用处,但我承认它有它的用武之地。
当您想将特定参数指定到方法中时,使用 :
运算符,例如我们有一个看起来像这样的方法:
void DoSomething(int numberOne = 0, int numberTwo = 0, int numberThree = 0)
并且我们想将此方法用于某些事情,但在不指定 numberOne
或 numberTwo
的情况下更改 numberThree
的值,那么这可以通过 :
运算符来实现因此:
DoSomething(numberThree: 3);
看到我做了什么吗?我指定了参数numberThree
并传入了数字3
。我也可以这样做:
DoSomething(0,0,3);
这里有更多信息:
-
解释起来更简单一些,因为它是一个数学函数,减去
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)));
我已将 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)));
注意区别:length:1 vs length-1
使用 length:1 我立即收到语法错误,但脚手架工作正常。
长度为 1,没有语法错误,但脚手架失败说:"Compiling transformation: The name 'length' does not exist in the current context' at line number '54' and column number '127'"
有人可以解释发生了什么事 and/or 建议修复吗?来回切换是变老了。
所以要启动运算符 :1
和 -1
从根本上说 不是 同一件事。
:
运算符有点奇怪,我没有发现它有多大用处,但我承认它有它的用武之地。
当您想将特定参数指定到方法中时,使用 :
运算符,例如我们有一个看起来像这样的方法:
void DoSomething(int numberOne = 0, int numberTwo = 0, int numberThree = 0)
并且我们想将此方法用于某些事情,但在不指定 numberOne
或 numberTwo
的情况下更改 numberThree
的值,那么这可以通过 :
运算符来实现因此:
DoSomething(numberThree: 3);
看到我做了什么吗?我指定了参数numberThree
并传入了数字3
。我也可以这样做:
DoSomething(0,0,3);
这里有更多信息:
-
解释起来更简单一些,因为它是一个数学函数,减去
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)));