【问题标题】:Custom Controller.cs.t4 only works when wrong自定义 Controller.cs.t4 仅在错误时有效
【发布时间】:2018-02-17 21:28:56
【问题描述】:

我已将 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 我会立即收到语法错误,但脚手架可以正常工作。

使用length-1,没有语法错误,但脚手架失败说:“编译转换:名称'length'在当前上下文中不存在'行号'54'和列号'127'”

有人可以解释发生了什么和/或提出修复建议吗?来回切换已经变老了。

【问题讨论】:

    标签: c# visual-studio t4


    【解决方案1】:

    所以启动运算符:1-1 根本上是一回事。 : 运算符有点奇怪,我没有发现它有太多用处,但我承认它有它的位置。

    : 运算符用于当您想在方法中指定特定参数时使用,例如我们有一个看起来像这样的方法:

    void DoSomething(int numberOne = 0, int numberTwo = 0, int numberThree = 0)
    

    我们想用这个方法做一些事情,但是改变numberThree的值而不指定numberOnenumberTwo,那么这可以通过:操作符来实现:

    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)));
    

    应该可以正常工作

    希望这会有所帮助。

    【讨论】:

    • 感谢您的出色解释。它引导我找到解决方案。
    【解决方案2】:

    解决方案是像这样使用字符串的 Length 属性:

    var entitySetVar = EntitySetVariable ?? (String.IsNullOrEmpty(entitySetName) ? entitySetName : (entitySetName.Substring(0, entitySetName.Length-1).ToLowerInvariant() + entitySetName.Substring(1)));
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-09-29
      • 2013-04-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多