Парсер для System.Type

VIT2708
Дата: 24.04.2014 11:50:02
Есть обобщенный класс парсер

 public delegate bool TryParse<T>(string value, out T result);

    public class Parser
    {
        public static T Parse<T>(string value, TryParse<T> tryParse)
        {
            T result;
            if (tryParse(value, out result))
                return result;

            return default(T);
        }
    }


Есть также список системных типов

public static System.Type GetSystemType(string type)
        {
            switch (type)
            {
                case "System.Int16":
                    return Type.GetType(type);
                case "System.Int32":
                    return Type.GetType(type);
                case "System.Int64":
                    return Type.GetType(type);
                case "System.DateTime":
                    return Type.GetType(type);
                case "System.Boolean":
                    return Type.GetType(type);
                case "System.Decimal":
                    return Type.GetType(type);
                case "System.Double":
                    return Type.GetType(type);
            }
        }


Ну вот собственно и проблема как можна сделать вот такое

Работает
Parser.Parse<DateTime>("01.01.2014", DateTime.TryParse);


Не работает
Parser.Parse<GetSystemType("System.DateTime")>("01.01.2014", GetSystemType("System.DateTime").TryParse);


То есть идея в том что бы в парсер можна было передавать тип данных через функцию а не вписывать вручную

Спасибо.
Где-то в степи
Дата: 24.04.2014 12:29:57
VIT2708,
ну есть же проще, без делегатов, и принято во всем мире по дефолту
 static   T Parse<T>(string str) where T : struct
        {
            var get = typeof (T).GetMethod("TryParse",new Type[] { typeof(string),  typeof(T).MakeByRefType() });
            T res = default(T);
            object[] args = { str, res };
            get.Invoke(null,args);
            return (T) args[1];
        }
netivan
Дата: 24.04.2014 12:39:00
Где-то в степи,

блин ну зачем тогда вообще Дженерики?передавайте объекте, дергайте его TYpe и дальше пытайтесь дергнуть метод.
Помойму надо сделать where T:ITryParse...
ЕвгенийВ
Дата: 24.04.2014 12:40:42
VIT2708
Есть обобщенный класс парсер



Не работает
Parser.Parse<GetSystemType("System.DateTime")>("01.01.2014", GetSystemType("System.DateTime").TryParse);


У System.Type нет метода TryParse

Спасибо.
VIT2708
Дата: 24.04.2014 12:45:28
Где-то в степи
VIT2708,
ну есть же проще, без делегатов, и принято во всем мире по дефолту
 static   T Parse<T>(string str) where T : struct
        {
            var get = typeof (T).GetMethod("TryParse",new Type[] { typeof(string),  typeof(T).MakeByRefType() });
            T res = default(T);
            object[] args = { str, res };
            get.Invoke(null,args);
            return (T) args[1];
        }


А можете привести пример что вместо T передавать?

допустим есть класс

class Test
{
string name { get; set;}
System.Type = type.GetType("название");
string Value { get; set;}
}


И вот если перебитать коллекцию класса Test

foreach(Test t in List<Test>)
{
// что передавать вместо T?
}
VIT2708
Дата: 24.04.2014 12:49:56
ЕвгенийВ
VIT2708
Есть обобщенный класс парсер



Не работает
Parser.Parse<GetSystemType("System.DateTime")>("01.01.2014", GetSystemType("System.DateTime").TryParse);


У System.Type нет метода TryParse

Спасибо.


Я понял, и как это решить другим способом что бы можна было в одном методе вызывать проверку TryParse для int, Int16, Int32, Int64, Float, Double, Decimal?
petalvik
Дата: 24.04.2014 13:17:08
VIT2708,

стандартный класс System.Convert не подойдёт?
Например:
Convert.ChangeType("01.01.2014", typeof(DateTime))
petalvik
Дата: 24.04.2014 13:19:13
Не дописал.
Вместо типа можно передавать параметр перечисления TypeCode (и не нужно вручную выписывать типы).
VIT2708
Дата: 24.04.2014 13:28:15
petalvik
Не дописал.
Вместо типа можно передавать параметр перечисления TypeCode (и не нужно вручную выписывать типы).


Я думал над этим, и как это мне поможет

мне надо вместо Т передать тип но этот тип данных должен определить статистический метод

static T Parse<FindType("System.Int32")>("параметры")

static Int16 или Int32 ... FindType(string type)
{
// код
}

Как "впихнуть" то что выделено красным в Parse?
petalvik
Дата: 24.04.2014 13:40:21
VIT2708
static T Parse<FindType("System.Int32")>("параметры")


Если так уж хочется использовать именно строку как параметр, то так:
Convert.ChangeType("01.01.2014", Type.GetType("System.DateTime"));