C#自动将ToLower应用于方法字符串参数?

时间:2013-03-24 09:02:19

标签: c# tolower

有没有办法让C#编译器在方法中使用之前自动将ToLower()(或任何其他操作方法调用)应用于特定的方法参数?

//其他信息:其目的是使用不区分大小写的字典。显然,我的第一种方法是完全错误的,因为我已经找到了一种完全不同的方法来解决字典本身,而不是它所访问的密钥。

我的坏!我应该已经为你提供了这些信息。所以,不需要进一步的答案。无论如何,非常感谢!

在这种特殊情况下更好的方法:c# Dictionary: making the Key case-insensitive through declarations

4 个答案:

答案 0 :(得分:10)

不,C#编译器不会为你做这个(为什么要根据这样的特定要求量身定做?),但你可以通过编写一个简单的包装器来完成这个工作{{1}围绕struct

string

隐式转换运算符允许您编写如下代码:

struct LowerCaseString
{
    public LowerCaseString(string value)
    {
        this.value = value.ToLower();
    }

    private readonly string value;

    public static implicit operator LowerCaseString(string value)
    {
        return new LowerCaseString(value);
    }

    public override string ToString()
    {
        return value;
    }

    … // perhaps implement IEquatable<>, IComparable<>, etc.
}

虽然这可以按照您的预期运行,但这种方法存在一些缺点:

  • 一个很小的(可能是可以忽略的)性能命中,因为必须在你的字符串周围实例化包装器对象。

  • 对于代码的其他用户来说,隐式转换运算符可能并不明显,因此他们最终会编写Foo("Hello world."); void Foo(LowerCaseString text) { Console.WriteLine(text); } 。如果您的团队经常使用它,使用Visual Studio的对象浏览器查看该类可能会解决此问题。

  • 此包装器不允许您指定用于new LowerCaseString("Hello world.")的{​​{1}}。您要使用CultureInfo.ToLower()还是其他?

答案 1 :(得分:4)

不使用某种AOP,没有。

PostSharp就是这样一个工具,但它增加了复杂性,隐藏代码和更高的编译时间。

在方法中直接对参数应用ToLower要简单得多,或者使用事先调用ToLower的方法将所有调用包装到方法中。 / p>

答案 2 :(得分:3)

一些AOP工具,如PostSharp,可以做到这一点。

但请检查两次,这确实是你想要的,并没有更简单,更清洁的方式。

答案 3 :(得分:0)

您可以按照其他人的建议完成此操作 - 通过AOP。但是,如果案例仅传递小写字符串,这将变得太复杂并且不值得努力(在我看来)。

您应该提供有关此事的更多信息,但我相信有更简单的方法来实现您的目标。看一下内置的字符串比较器类 - 如果你需要小写字符串进行比较,那么StringComparer.OrdinalIgnoreCase可能适合你的目的。 如果您需要以小写格式向用户显示字符串,那么这是显示字符串的代码的责任,而不是业务逻辑。