自定义 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)

并且我们想将此方法用于某些事情,但在不指定 numberOnenumberTwo 的情况下更改 numberThree 的值,那么这可以通过 : 运算符来实现因此:

DoSomething(numberThree: 3);

看到我做了什么吗?我指定了参数numberThree并传入了数字3。我也可以这样做:

DoSomething(0,0,3);

这里有更多信息:

https://docs.microsoft.com/en-us/dotnet/csharp/programming-guide/classes-and-structs/named-and-optional-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)));