C# 如何在C语言中实现contains操作符#

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

我正在创建动态转换器,将Visual FoxPro表达式转换为Razor视图中使用的C#表达式

FoxPro包含运算符
$

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视图,如果遇到
$
。困难的部分是如何找到表达式的结尾