#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); } }
Комментариев нет:
Отправить комментарий