powered by simpleCommunicator - 2.0.56     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Парсер для System.Type
16 сообщений из 16, страница 1 из 1
Парсер для System.Type
    #38624256
VIT2708
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Есть обобщенный класс парсер

Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
 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);
        }
    }



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

Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
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);
            }
        }



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

Работает
Код: c#
1.
Parser.Parse<DateTime>("01.01.2014", DateTime.TryParse);



Не работает
Код: c#
1.
Parser.Parse<GetSystemType("System.DateTime")>("01.01.2014", GetSystemType("System.DateTime").TryParse);



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

Спасибо.
...
Рейтинг: 0 / 0
Парсер для System.Type
    #38624369
Фотография Где-то в степи
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
VIT2708,
ну есть же проще, без делегатов, и принято во всем мире по дефолту
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
 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];
        }
...
Рейтинг: 0 / 0
Парсер для System.Type
    #38624393
netivan
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Где-то в степи,

блин ну зачем тогда вообще Дженерики?передавайте объекте, дергайте его TYpe и дальше пытайтесь дергнуть метод.
Помойму надо сделать where T:ITryParse...
...
Рейтинг: 0 / 0
Парсер для System.Type
    #38624398
Фотография ЕвгенийВ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
VIT2708Есть обобщенный класс парсер



Не работает
Код: c#
1.
Parser.Parse<GetSystemType("System.DateTime")>("01.01.2014", GetSystemType("System.DateTime").TryParse);



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

Спасибо.
...
Рейтинг: 0 / 0
Парсер для System.Type
    #38624410
VIT2708
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Где-то в степиVIT2708,
ну есть же проще, без делегатов, и принято во всем мире по дефолту
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
 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 передавать?

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

Код: c#
1.
2.
3.
4.
5.
6.
class Test
{
string name { get; set;}
System.Type = type.GetType("название");
string Value { get; set;}
}



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

Код: c#
1.
2.
3.
4.
foreach(Test t in List<Test>)
{
// что передавать вместо T?
}
...
Рейтинг: 0 / 0
Парсер для System.Type
    #38624425
VIT2708
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ЕвгенийВVIT2708Есть обобщенный класс парсер



Не работает
Код: c#
1.
Parser.Parse<GetSystemType("System.DateTime")>("01.01.2014", GetSystemType("System.DateTime").TryParse);



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

Спасибо.

Я понял, и как это решить другим способом что бы можна было в одном методе вызывать проверку TryParse для int, Int16, Int32, Int64, Float, Double, Decimal?
...
Рейтинг: 0 / 0
Парсер для System.Type
    #38624487
petalvik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
VIT2708,

стандартный класс System.Convert не подойдёт?
Например:
Код: c#
1.
Convert.ChangeType("01.01.2014", typeof(DateTime))
...
Рейтинг: 0 / 0
Парсер для System.Type
    #38624492
petalvik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Не дописал.
Вместо типа можно передавать параметр перечисления TypeCode (и не нужно вручную выписывать типы).
...
Рейтинг: 0 / 0
Парсер для System.Type
    #38624510
VIT2708
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
petalvikНе дописал.
Вместо типа можно передавать параметр перечисления TypeCode (и не нужно вручную выписывать типы).

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

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

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

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

Как "впихнуть" то что выделено красным в Parse?
...
Рейтинг: 0 / 0
Парсер для System.Type
    #38624536
petalvik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
VIT2708static T Parse<FindType("System.Int32")>("параметры")

Если так уж хочется использовать именно строку как параметр, то так:
Код: c#
1.
Convert.ChangeType("01.01.2014", Type.GetType("System.DateTime"));
...
Рейтинг: 0 / 0
Парсер для System.Type
    #38624653
Lelouch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
VIT2708,

в Generic это можно "впихнуть" только через рефлексию (мб еще Emit) примерно так:

Код: c#
1.
2.
var genParseMethod = typeof(Parser).GetMethod("Parse", BindingFlags.Public | BindingFlags.Static);
var parseMethod = genParseMethod.MakeGenericMethod(GetSystemType("System.DateTime"));
...
Рейтинг: 0 / 0
Парсер для System.Type
    #38624845
Сон Веры Павловны
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
еще как вариант:
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
static bool FromString<T>(string value, out T result)
{
  try
  {
    var v = TypeDescriptor.GetConverter(typeof(T)).ConvertFromString(value);
    if (v != null)
    {
      result = (T) v;
      return true;
    }
  }
  catch (NotSupportedException){}
  result = default(T);
  return false;
}
...
Рейтинг: 0 / 0
Парсер для System.Type
    #38624937
Arm79
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
VIT2708
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
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);
            }
        }


А в чем смысл этого? Почему просто не написать return Type.GetType(type), без всяких свичей?
...
Рейтинг: 0 / 0
Парсер для System.Type
    #38624970
VIT2708
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Arm79VIT2708
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
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);
            }
        }


А в чем смысл этого? Почему просто не написать return Type.GetType(type), без всяких свичей?

Вот в этом

Код: c#
1.
2.
3.
Test t1 = new Test() { name = "t1", Type = typeof("DateTime"), value="01.01.2014"};
Test t1 = new Test() { name = "t2", Type = typeof("int"), value="1"};
Test t1 = new Test() { name = "t3", Type = typeof("float"), value="50.55"};



Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
foreach(Test t in List<Test>
{
//здесь я создаю sql parameter для записи в базу, поскольку данные приходят разные то хотел создать что то наподобие шаблона
SqlParameter param = new SqlParameter();
param.Add("@поле", sqlDbType - в зависимости от типа);
// и еще что бы не было ошибок сервера то проверить данные через TryParse
//и т. д.
}



Если подскажите вариант лучше, буду очень благодарен
...
Рейтинг: 0 / 0
Парсер для System.Type
    #38624990
Arm79
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
VIT2708,

Ни фига не понятно.

1) Зачем вам явное перечисление типов?
2) Пример с параметрами ХП немного смущает. Вы не знаете, какого типа параметры и какие значения вы передаете?
...
Рейтинг: 0 / 0
Парсер для System.Type
    #38625272
Фотография Нахлобуч
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Там и без вас справятся:
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
private static void PrepareSqlCommand(SqlCommand sqlCommand, object parameters)
{
    if(parameters == null) return;

    foreach(var propertyInfo in parameters.GetType().GetProperties(BindingFlags.Instance | BindingFlags.Public))
    {
        var name = "@" + propertyInfo.Name;
        var value = propertyInfo.GetValue(parameters, null) ?? DBNull.Value;

        sqlCommand.Parameters.AddWithValue(name, value);
    }
}

// ...

PrepareSqlCommand(sqlCommand, new { t1 = DateTime.UtcNow.AddDays(-1), t2 = 12312, t3 = 234m });
...
Рейтинг: 0 / 0
16 сообщений из 16, страница 1 из 1
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Парсер для System.Type
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]