Можно ли привести один объект к типу 2-го объекта, не зная ни одного типа? - PullRequest
1 голос
/ 19 ноября 2010

У меня есть простой конвертер, который проверяет, равен ли объект тому параметру, который я передаю. Моя проблема в том, что параметр конвертера всегда передается как строка, а значение всегда передается как объект. Чтобы сравнить их правильно, мне нужно привести параметр к тому же типу, что и значение. Есть ли способ, которым я мог бы привести тип одного объекта к типу другого, не зная заранее ни одного типа?

public class IsObjectEqualParameterConverter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
    {
        if (value == null && parameter == null)
            return true;

        if (value == null)
            return false;

        // Incorrectly returns False when the ConverterParameter is an integer
        // Would like to try and cast parameter into whatever type value before checking equality
        // Something like: return value.Equals((parameter as value.GetType()));
        return value.Equals(parameter);
    }

    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
    {
        throw new NotImplementedException();
    }
}

И пример использования будет что-то вроде:

<Button IsEnabled="{Binding Path=Index, ConverterParameter=0, Converter={StaticResource IsObjectEqualParameterConverter}}" />

Ответы [ 2 ]

6 голосов
/ 19 ноября 2010
parameter = Convert.ChangeType(parameter, value.GetType());

Это будет работать только тогда, когда истинный тип переменной parameter реализует IConvertible (все типы примитивов делают, плюс строка). Так что он будет преобразовывать строки в примитивные типы:

csharp> Convert.ChangeType("1", typeof(int));
1
csharp> Convert.ChangeType("1", typeof(int)).GetType();
System.Int32

И наоборот:

csharp> Convert.ChangeType(1, typeof(string));
"1"
csharp> Convert.ChangeType(1, typeof(string)).GetType();
System.String
0 голосов
/ 19 ноября 2010

Вы можете попробовать использовать Reflections для этой цели:

using System.Reflection; 
int a = 10;
            string str = "10";
            Type a_type = a.GetType(), str_type = str.GetType();
            try
            {
                if (Convert.ChangeType((object)a, str_type).Equals(str))
                {

                }
            }
            catch (Exception ex)
            {
                //Can't to cast one type to other
            }

Если вы изменяете типы переменных, этот код вызывает исключение и замечает, что вы пытались привести «некастабельные» типы.

...