C# 如何在C语言中实现contains操作符#
我正在创建动态转换器,将Visual FoxPro表达式转换为Razor视图中使用的C#表达式 FoxPro包含运算符C# 如何在C语言中实现contains操作符#,c#,asp.net-mvc,c#-4.0,razor,visual-foxpro,roslyn,C#,Asp.net Mvc,C# 4.0,Razor,Visual Foxpro,Roslyn,我正在创建动态转换器,将Visual FoxPro表达式转换为Razor视图中使用的C#表达式 FoxPro包含运算符$ a$b 如果类b的if子字符串包含(a,b),则返回true: 使用此Contains方法调用替换$运算符需要创建复杂的解析器。不确定如何实现这个解析器a$b可以是表达式的一部分,a和b可以是字符串表达式 如何让它工作? 是否可以实现contains操作符(操作符名称可以更改,解析器可以轻松发出)? 还是有其他方法可以避免手动转换FoxPro表达式 表达式在ASP.NET M
$
a$b
如果类b的if子字符串包含(a,b),则返回true:
使用此Contains方法调用替换$
运算符需要创建复杂的解析器。不确定如何实现这个解析器a$b
可以是表达式的一部分,a
和b
可以是字符串表达式
如何让它工作?
是否可以实现contains操作符(操作符名称可以更改,解析器可以轻松发出)?
还是有其他方法可以避免手动转换FoxPro表达式
表达式在ASP.NET MVC4应用程序的C#Razor视图中使用
更新
我可以使用标准运算符,例如
%
。如何在Razor视图中为字符串实现a%b
运算符,如果a包含在b中,则返回true 运算符重载仅适用于已知运算符:+
、*
、=
等。$
不是已知运算符,因此无法执行您想要执行的操作
您可以使用新平台更改语言本身并使之成为可能(请参阅Build 2014上的演示文稿,其中演示了如何使用奇特的重音来表示字符串,而不是“
)
在textform中(请参阅:“更新编译器的示例”):运算符重载仅适用于已知运算符:
+
、*
、==
,等等。$
不是已知运算符,因此不可能执行您想要执行的操作
您可以使用新平台更改语言本身并使之成为可能(请参阅Build 2014上的演示文稿,其中演示了如何使用奇特的重音来表示字符串,而不是“
)
在textform中(请参阅:“更新编译器的示例”):您可以使用扩展方法简化“解析”工具的工作 如果您使用如下方法:
public static bool FPContains(this string a, string b)
{
if (a == null || b == null)
return false;
return b.Contains(a);
}
在静态类(这是一个重要的约束)中,您可以使用新的FPContains
方法,就像它直接在string
类型中实现一样,例如:
bool isContained = string1.FPContains(string2);
您可以使用扩展方法简化“解析”工具的工作 如果您使用如下方法:
public static bool FPContains(this string a, string b)
{
if (a == null || b == null)
return false;
return b.Contains(a);
}
在静态类(这是一个重要的约束)中,您可以使用新的FPContains
方法,就像它直接在string
类型中实现一样,例如:
bool isContained = string1.FPContains(string2);
有一些关于为什么不能重载现有运算符来执行所需操作的背景知识。如果下面的答案没有帮助,请继续研究如何实现解析器,因为您有可能成为解析器的受害者。我可以使用从标准string类继承的string类。回答中的评论写道,在这种情况下,实现containedin操作符是可能的。如何实施?有一些关于为什么不能重载现有运算符来执行所需操作的背景知识。如果下面的答案没有帮助,请继续研究如何实现解析器,因为您有可能成为解析器的受害者。我可以使用从标准string类继承的string类。回答中的评论写道,在这种情况下,实现containedin操作符是可能的。如何实现它?我可以使用标准运算符,例如
%
。如何为字符串实现a%b
运算符如果a包含在b中,则该运算符返回true?我没有重写语言的一部分,你不能。解释为什么.NET应用程序应在.NET 4中运行,并带有ASP.NET MVC4和Razor 2。我正在使用开源RazorEngine在razor视图中运行这些转换后的表达式。如何在RazorEngine中实现和使用$operator,强制RazorEngine使用新的编译器?您不能重载string
类的运算符,因为您既不能定义它,也不能从它继承。表达式使用+
运算符和已知的字符串方法。我可以创建新的类并实现所需的方法,希望能实现+
操作符。如何为这个类似字符串的类实现a containedin b
或a%b
运算符?我可以使用标准运算符,例如%
。如何为字符串实现a%b
运算符如果a包含在b中,则该运算符返回true?我没有重写语言的一部分,你不能。解释为什么.NET应用程序应在.NET 4中运行,并带有ASP.NET MVC4和Razor 2。我正在使用开源RazorEngine在razor视图中运行这些转换后的表达式。如何在RazorEngine中实现和使用$operator,强制RazorEngine使用新的编译器?您不能重载string
类的运算符,因为您既不能定义它,也不能从它继承。表达式使用+
运算符和已知的字符串方法。我可以创建新的类并实现所需的方法,希望能实现+
操作符。如何为这个类似字符串的类实现a containedin b
或a%b
运算符?您永远无法将其作为扩展方法调用,因为它的签名与实例方法匹配。是的,FoxPro解析器可以发出.FPContains(
遇到$
时查看Razor的字符串。困难的部分是如何找到表达式的结尾在哪里发出结束语)
?如何实现)
发出?string1也可以是表达式。因此,需要将其插入()大括号中才能使用扩展方法。如何找到要发出(
)的string1表达式的开头?您永远无法将其作为扩展方法调用,因为它的签名与实例方法匹配。是的,FoxPro解析器可以发出。FPContains(
字符串到Razor视图,如果遇到$
。困难的部分是如何找到表达式的结尾