我有一个DataGridView,我正在编写一些通用代码来添加过滤器。列的基础数据类型可以是任何东西,但是,如果它们是字符串,我希望过滤器使用不区分大小写的比较。
我还使用该Equals
方法而不是==
运算符来确保它不仅在进行参考比较。字符串Equals
方法有一个重载,让您选择一种StringComparison
类型,但是我不知道它是否将是字符串,因此我只能访问Equals
可用的方法object
。
我尝试Equals
为此编写扩展方法,object
以便让我指定StringComparison
类型。这样的想法是,如果对象是字符串,那么它将Equals
在字符串对象上调用适当的重载,但否则,它将仅使用常规Equals
方法。但是,这似乎不起作用,因为我收到一个编译错误,指出我不能将该方法作为实例方法来访问,而必须指定一个类型。我在下面包括了扩展方法,以防万一我做错了什么……我确实匆忙编写了它,但我不认为这是问题所在。我想我只需要找到另一种方法即可。
public static class Extensions
{
public static bool Equals(this object obj1, object obj2, StringComparison comparisonType)
{
if (obj1 == null && obj2 == null)
return true;
if (obj1 == null && obj2 != null)
return false;
if (obj1 != null && obj2 == null)
return false;
string s = obj1 as string;
if (s != null)
{
var s2 = obj2 as string;
return s2 != null && s.Equals(s2, comparisonType);
}
else
return obj1.Equals(obj2);
}
}
因此,我正在寻找一种更好的方法,或者如果我只是在上面的代码中犯了一个错误,请告诉我。
编辑:
下面也是消费代码的样子。_filters只是具有一些属性的对象的列表,如下面所引用的,项目为IEnumerable<T>
。
foreach (var f in _filters)
{
items = items.Where(o => o[f.FieldName].Equals(f.Value, StringComparison.InvariantCultureIgnoreCase));
}
您可以使用其他扩展方法(例如)IsEqual
,然后在方法内部检查参数是否为字符串,以您喜欢的方式进行比较。
例如,类似下面的代码。我没有测试功能,只是演示了这个想法:
public static class ObjectExtesions
{
public static bool IsEqual(this object left, object right)
{
if (left == null && right == null)
return true;
if (left != null && right != null)
{
if (left is string && right is string)
return ((string)left).Equals((string)right,
StringComparison.InvariantCultureIgnoreCase);
else
return left.Equals(right);
}
return false;
}
}
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句