Приведите bool к T, где T это int - PullRequest
0 голосов
/ 12 сентября 2009

Как сделать так, чтобы эта функция надежно приводила sourceValue к типу T, где sourceValue - bool, а T - int?

public static T ConvertTo<T>(Object sourceValue)
{
  // IF IS OF THE SAME TYPE --> RETURN IMMEDIATELY
  if (sourceValue is T)
    return (T) sourceValue;

  var val = ConvertTo(sourceValue, typeof (T));
  return (T) val; 
}

В настоящее время это вызывает исключение InvalidCastException при попытке преобразовать false в 0 и true в 1. Типы не предопределены, поэтому здесь должны использоваться непатентованные значения. Однако, единственный случай, когда это терпит неудачу, - это когда T: Int32 и sourceValue: Boolean.

Ответы [ 5 ]

4 голосов
/ 12 сентября 2009

Является ли false = 0 и true = 1? Может быть, на других языках, но здесь актерский состав не имеет смысла. Если вам это действительно нужно, я думаю, что это особый случай.

2 голосов
/ 12 сентября 2009

Я думаю, что преобразование bool в int не определено. Тем не менее, я не считаю целесообразным записывать этот особый случай в вашей функции явно, иначе ваша функция несовместима с тем, как .NET неявно обрабатывает int и bools.

Тебе лучше всего писать:

int value = someFlag ? 1 : 0;
1 голос
/ 12 сентября 2009

Не совсем уверен, что вы пытаетесь сделать, но .net поддерживает преобразование bool в int:

Convert.ToInt32(true);

Он также может взять object и выяснить, является ли он bool.
Смотрите также: Convert.ToInt32 (bool) , Convert.ToInt32 (Object)

0 голосов
/ 03 июля 2014

В качестве продолжения собственного ответа Марка. Я думаю, что это достойное решение:

        protected Nullable<T> ConvertTo<T>(Object sourceValue) where T : struct, IComparable
    {
        if (sourceValue is T)
            return (T)sourceValue;

        if (sourceValue == null)
        {
            return null;
        }
        try
        {
            var val = Convert.ChangeType(sourceValue, typeof(T));
            return (T)val;
        }
        catch (FormatException)
        {
            return null;
        }

    }
0 голосов
/ 12 сентября 2009

Мне нужно очень универсальное решение. Это лучшее, что я мог придумать:

public static T ConvertTo(Object sourceValue)
    {
      // IF IS OF THE SAME TYPE --> RETURN IMMEDIATELY
      if (sourceValue is T)
        return (T) sourceValue;

      var val = ConvertTo(sourceValue, typeof (T));

      // SPECIAL CASE: Convert bool(sourceValue) to int(T)
      if (val is bool)
      {
        var b = (bool) val;
        if (b)
          return (T) (object) 1; // if val is true, return 1

        return (T) (object) 0;
      }

      return (T) val;
    }
...