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是值的类,如果此运算符是declaredSo
null==value
是否等同于您的“最精确方式”?否,在这种情况下,也可以使用“公共静态布尔运算符==(ValueClass左,ValueClass右){…}”。