C# 比较任意类型的两个对象的等效性
我有一个函数,它接受两个通用对象输入,将第二个转换为第一个,然后比较这两个 职能:C# 比较任意类型的两个对象的等效性,c#,C#,我有一个函数,它接受两个通用对象输入,将第二个转换为第一个,然后比较这两个 职能: public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) { object parameterCast = System.Convert.ChangeType(parameter, value.GetType()); return
public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
object parameterCast = System.Convert.ChangeType(parameter, value.GetType());
return parameterCast.Equals(value);
}
然而,我认为这其中有几个问题我不知道如何解决
第一个问题是,如果参数不能转换为值怎么办
其次,我是否需要检查每个对象是否为null?如果是,怎么做
是否有人对修改此功能有任何建议或建议
非常感谢您的帮助。我不确定您是否需要单独的方法1。你能举几个例子说明你打算如何使用这个方法吗 至于修改函数,示例代码不使用
targetType
或区域性
参数。此外,函数的名称令人困惑,因为它的返回值是Equals
方法的结果
您可以使用parameter==(ParameterTargetType)value
,而不是使用该方法,但无法将对象转换为任意类型或类,因此您需要实现某种方法,或者使用try。。。catch…
语句来处理可能的强制转换异常
哦,是的,要检查对象是否为null,只需使用object==null
。使用if
语句,您可以编写:
if (value == null)
{
// Do something if the 'value' object is null.
}
1通常,C#中的函数称为方法。当函数是类的成员时,它们总是(?)。检查值是否为null的最准确方法是
if (Object.ReferenceEquals(null, value)) {
// value is null
...
}
其他流行方式
// == operartor can be implemented explicitly
if (value == null) {...}
// Equals method could be overriden
if (Object.Equals(null, value)) {...}
可能不正确,因为可以重写/重新声明Equals
方法或/和==运算符 这将检查引用是否指向同一对象,然后检查其中一个是否为null,您可以随时返回所需内容。之后你可以施放,然后比较是否两者都通过
if (System.Object.ReferenceEquals(lhs, rhs))
{
return true;
}
if (System.Object.ReferenceEquals(lhs, null) || System.Object.ReferenceEquals(rhs, null))
{
return false;
}
但是,我会考虑实际使用泛型函数。这样的办法应该行得通。如果as TData
失败,如果不返回equals操作,对象将为null
public object Convert<TData>(TData value, object parameter, System.Globalization.CultureInfo culture)
where TData : class
{
TData convertedObject = parameter as TData;
if (convertedObject == null)
return false;
else
return value == convertedObject;
}
公共对象转换(TData值、对象参数、System.Globalization.CultureInfo区域性)
其中TData:class
{
TData convertedObject=参数为TData;
if(convertedObject==null)
返回false;
其他的
返回值==转换对象;
}
但是它还没有经过测试。此函数中没有泛型。查看的MSDN文档也会有所帮助。如果该演员不受支持,它将抛出InvalidCastException。@TimRogers是的,对不起。当我写这篇文章的时候,我并没有真正的思考,我的意思是泛型,因为它只是一个普通对象,我不知道它的类型。我想这里“泛型”是指类型object
。太好了,谢谢。我现在就去试一试。这种格式必须保持不变,因为整个代码的结构都是一样的(称它们为转换器也让我有点不知所措)。不过,我一直不清楚方法和函数之间的区别,很高兴知道我应该使用什么。对于value==null
使用哪个=
,“公共静态布尔运算符==(ValueClass左,ValueClass右){…},其中ValueClass是值的类,如果此运算符是declaredSonull==value
是否等同于您的“最精确方式”?否,在这种情况下,也可以使用“公共静态布尔运算符==(ValueClass左,ValueClass右){…}”。