用参数值替换硬编码的问题

Posted

技术标签:

【中文标题】用参数值替换硬编码的问题【英文标题】:problem replacing hardcoded with parameter values 【发布时间】:2021-07-04 05:56:48 【问题描述】:

我的 BIML 文件中有这个结构:

myColumns = myFile.ReadLine().Replace("\"","").Split('|');

我想将其替换为:

myColumns = myFile.ReadLine().Replace("\"","").Split('<#=delimiter#>');

但显然这不起作用。不知怎的,syntaxhighlighting 告诉我这是行不通的.....

还有:

string[] myFiles = Directory.GetFiles(path, "*.csv");

string[] myFiles = Directory.GetFiles(path, "*.<#=filetype#>");

简单使用时

 myColumns = myFile.ReadLine().Replace("\"","").Split('delimiter');

它告诉我Cannot implicitly convert type 'string' to 'char'

分隔符声明为string delimiter ="|"

当将其更改为char delimiter ="|" 时,我得到完全相同的错误,但是在我声明分隔符的那一行.....

【问题讨论】:

char delimiter ="|"; 失败,因为字符使用单个刻度线,因此 char delimiter ='|'; @billinkc 只是一个挑剔,但它使用单引号 ' 而不是反引号 ` 或 'forward' 引号 ´ 字符 @iamdave 是的,我发现当我告诉人们单引号时,他们可以将其解释为双引号 " 所以我已经习惯将单引号称为刻度线并将反引号称为返回打钩。我不知道前向刻度,又名acute accent 【参考方案1】:

如果我对您的理解正确,您的这部分文件:

myColumns = myFile.ReadLine().Replace("\"","").Split('|');

将已经包含在代码块或单独的代码文件中,是吗?如果是这样,您不需要使用另一个代码块参数化 delmiter,而只需引用该变量,假设您已经在某处声明了它:

<#
...
char delimiter = '|';
...
var myColumns = myFile.ReadLine().Replace("\"","").Split(delimiter);
...
#>

作为对您的评论的回应,在您的 Biml 文件中使用此代码可能看起来像这样?

...
 <Tables>
  <Table Name="TableName" etc>
    <Columns>
    <# // This is the start of a Code Block

     // We can define some C# data structures
     char delimiter = '|';
     var myColumns = myFile.ReadLine().Replace("\"","").Split(delimiter);

     // Then start a loop which will generate some Biml nodes
     foreach(string col in myColumns)
     
      // Note that the foreach loop is left open despite closing the code block on the next line.
      // This means the following Biml is looped over until the foreach ends.
    #>
     <Column Name="<#=col#>" etc />
    <# // We can then start another code block which carries on from the last one
      // This closes the foreach loop defined earlier
    #>
    </Columns>
  </Table>
 </Tables>
...

您可以在此示例中看到 C# 代码如何包含在 &lt;##&gt; 标记中,并且在其他任何地方都带有原始 Biml。 &lt;#=#&gt; 标记的使用是引用先前定义的 C# 变量的语法快捷方式。这些显然只有当您在文件的 Biml 部分中而不是在代码块中时才需要。

【讨论】:

我猜这就是 c# 的工作方式,但这些是 BIML 文件 @Henrov 是的,但是 BIML 是一种类似于 XML 的语法,可以在 代码块内包含 C# 代码,如 &lt;# ... #&gt; 标签所示。您不能只在文件中的任何位置使用 C#,它必须在代码块中。如果您可以将更多 Biml 文件发布到您的问题中,那么您的 Biml 和 C# 部分的开始和结束位置应该很明显。 我会试试这个。 @Henrov 问题就在您的错误消息中:错误:参数 1:无法从 'string' 转换为 'char' - 您正在尝试使用 @当Split 函数需要char 数据类型时,987654330@ 数据类型作为分隔符。在 C# 中,您可以看到使用单引号 'char 文字和使用双引号 " 的字符串的这种区别,根据您的示例代码,Replace 采用 string 数据类型和 Split 和 @987654339 @:.Replace("\"","").Split('|');

以上是关于用参数值替换硬编码的问题的主要内容,如果未能解决你的问题,请参考以下文章

更改 javascript 文件中的硬编码 ID

逗号分隔值循环使用硬编码值但不使用参数值

用于测试的硬编码SSRS多值参数

替换WordPress插件中的硬编码JavaScript字符串

如何修改代码中的硬编码问题

Github GraphQL API,硬编码访问令牌有效,试图混淆它没有