比较任意类型的两个对象的等价性

时间:2014-02-14 14:07:44

标签: c#

我有一个函数,它接受两个通用对象输入,将第二个转换为第一个,然后比较两个。

功能:

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);
}

我认为这有几个问题,但我不确定如何解决。

首先,如果不能将参数转换为值,该怎么办?

其次,我是否需要检查每个对象是否为空?如果是这样,怎么样?

是否有人对修改此功能有任何建议或建议?

非常感谢任何帮助,谢谢。

3 个答案:

答案 0 :(得分:2)

检查value是否为空的最准确方式是

  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方法或/和== operator可以覆盖/重新声明

答案 1 :(得分:1)

我不确定您是否需要单独的方法 1 。您是否会提供一些您打算如何使用该方法的示例?

至于修改函数,您的示例代码不使用targetTypeculture参数。此外,函数的名称令人困惑,因为它的返回值是Equals方法的结果。

您可以使用parameter == (ParameterTargetType)value而不是使用该方法,但是无法将对象转换为任意类型或类,因此您需要实现某种方式来实现,或者使用try ... catch ...语句来处理可能的强制转换异常。

哦,是的,要检查对象是否为空,只需使用object == null。使用if语句,您可以写:

if (value == null)
{
    // Do something if the 'value' object is null.
}

1 通常,C#中的函数称为方法。它们总是(?)是函数是类的成员。

答案 2 :(得分:1)

这将检查引用是否指向同一个东西,然后检查是否为null,您可以返回您想要的内容。在它之后你可以施放然后比较,如果这两个都通过。

if (System.Object.ReferenceEquals(lhs, rhs))
{
    return true;
}
if (System.Object.ReferenceEquals(lhs, null) || System.Object.ReferenceEquals(rhs, null))
{
    return false;
}

但是我会考虑实际使用Generic函数。这样的事情应该有效。如果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;
    }

虽然未经测试。