用参数值替换硬编码的问题
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# 代码如何包含在 <#
和 #>
标记中,并且在其他任何地方都带有原始 Biml。 <#=
和 #>
标记的使用是引用先前定义的 C# 变量的语法快捷方式。这些显然只有当您在文件的 Biml 部分中而不是在代码块中时才需要。
【讨论】:
我猜这就是 c# 的工作方式,但这些是 BIML 文件 @Henrov 是的,但是 BIML 是一种类似于 XML 的语法,可以在 代码块内包含 C# 代码,如<# ... #>
标签所示。您不能只在文件中的任何位置使用 C#,它必须在代码块中。如果您可以将更多 Biml 文件发布到您的问题中,那么您的 Biml 和 C# 部分的开始和结束位置应该很明显。
我会试试这个。
@Henrov 问题就在您的错误消息中:错误:参数 1:无法从 'string' 转换为 'char' - 您正在尝试使用 @当Split
函数需要char
数据类型时,987654330@ 数据类型作为分隔符。在 C# 中,您可以看到使用单引号 '
的 char
文字和使用双引号 "
的字符串的这种区别,根据您的示例代码,Replace
采用 string
数据类型和 Split
和 @987654339 @:.Replace("\"","").Split('|');
以上是关于用参数值替换硬编码的问题的主要内容,如果未能解决你的问题,请参考以下文章