Как привести к generic типу?

117
24 августа 2021, 04:40
private bool TryParseOf<TType>(string s, out TType result)
{
    if (typeof(TType) == typeof(int))
    {
        var parseSuccessful = int.TryParse(s, out var innerResult);
        result = innerResult; // в этой строке проблема
        return parseSuccessful;
    }
    throw new NotImplementedException();
}

нельзя просто взять и привести. TType может быть int, string, etc.

Answer 1
private bool TryParseOf<TType>(string s, out TType result)
{
    var converter = TypeDescriptor.GetConverter(typeof(TType));
    try
    {
        result = (TType)converter.ConvertFromString(s);
    }
    catch (ArgumentException)
    {
        result = default;
        return false;
    }
    return true;
}
Answer 2

Если делаем для простых типов, то

public class MyClass
{
    public bool TryParseOf<TType>(string s, out TType result)
    {
        var converter = TypeDescriptor.GetConverter(typeof(TType));
        if (converter.CanConvertFrom(typeof(string)))
        {
            result = (TType)converter.ConvertFrom(s);
            return true;
        }
        result = default(TType);
        return false;
    }
}

Проверка

var c = new MyClass();  
if (c.TryParseOf("11", out int i)) Console.WriteLine(i); // 11
if (c.TryParseOf("11", out double j)) Console.WriteLine(j); // 11
Answer 3

В принципе, приведение можно сделать через object, но я не уверен, будут ли там тогда лишняя упаковка и распаковка. Если будут, то способ мне не очень нравится.

https://ideone.com/ziADyJ

using System;
public class Test
{
  private static bool TryParseOf<TType>(string s, out TType result)
  {
    if (typeof(TType) == typeof(int))
    {
      var parseSuccessful = int.TryParse(s, out int innerResult);
      result = (TType)(object)innerResult;
      return parseSuccessful;
    }
    throw new NotImplementedException();
  }
  public static void Main()
  {
    Console.WriteLine("{0}: {1}", TryParseOf1<int>("123", out var x), x);
  }
}
READ ALSO
При уничтожении обьекта подвисает игра на Unity

При уничтожении обьекта подвисает игра на Unity

При уничтожении игрового объекта Destroy(gameobject); подвисает на секунду играПричина этому проклятая библиотека A* Pathfinding Project Выключая главный...

106
Как обратиться к данным в Entity Framework

Как обратиться к данным в Entity Framework

В моемNet Core приложении я хранил данные в классе DataService

281
Вычисление координат в матрице

Вычисление координат в матрице

Есть 5x5 матрица квадратов в произвольной части экранаКак найти координаты (x, y) в центре каждого квадрата?

120