Страницы

Поиск по вопросам

понедельник, 30 декабря 2019 г.

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

#c_sharp #рефлексия


private bool TryParseOf(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.
    


Ответы

Ответ 1



private bool TryParseOf(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; }

Ответ 2



Если делаем для простых типов, то public class MyClass { public bool TryParseOf(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

Ответ 3



В принципе, приведение можно сделать через object, но я не уверен, будут ли там тогда лишняя упаковка и распаковка. Если будут, то способ мне не очень нравится. https://ideone.com/ziADyJ using System; public class Test { private static bool TryParseOf(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("123", out var x), x); } }

Комментариев нет:

Отправить комментарий