Как сделать проверку типов в generic-методе
От: aleyush Россия  
Дата: 20.01.07 09:01
Оценка:
Вопрос скорее просто по синтаксису, но что-то туплю.

Делаю метод для чтения параметров из строки запроса ASP.NET. Такой вариант работает:

        protected bool TryLoadRequestParam<T>(string ParamName, out T ParamValue)
        {
            string paramValue = Request.Params[ParamName];
            if (paramValue == null)
            {
                ParamValue = default(T);
                return false;
            }

            try
            {
                ParamValue = (T)Convert.ChangeType(paramValue, typeof(T));
            }
            catch (InvalidCastException)
            {
                ParamValue = default(T);
                return false;
            }

            return true;
        }



Что в этом варианте не нравится.
Подавляющее большинство использований этой функции — либо string, либо int.
Хочется вставить перед try что-то в этом духе:

if (T это string) {ParamValue=paramValue; return}
if (T это int) return int.TryParse(paramValue, out ParamValue);


Но не могу это оформить с точки зрения синтаксиса. Как это можно сделать?

P.S. Вариант сделать 3 отдельные функции понимаю, но хочется все-таки одну (к тому же на нее уже код завязан).
---
Александр Ющенко
Re: Как сделать проверку типов в generic-методе
От: IvanDunaev  
Дата: 20.01.07 09:13
Оценка:
Здравствуйте, aleyush, Вы писали:

A>Хочется вставить перед try что-то в этом духе:


A>
A>if (T это string) {ParamValue=paramValue; return}
A>if (T это int) return int.TryParse(paramValue, out ParamValue);
A>


A>Но не могу это оформить с точки зрения синтаксиса. Как это можно сделать?


может, имеется в виду

typeof(T) == typeof(string)
Re: Как сделать проверку типов в generic-методе
От: Вячеслав Украина  
Дата: 20.01.07 09:27
Оценка:
Здравствуйте, aleyush, Вы писали:

A>Вопрос скорее просто по синтаксису, но что-то туплю.

A>Делаю метод для чтения параметров из строки запроса ASP.NET. Такой вариант работает:
A>
A>        protected bool TryLoadRequestParam<T>(string ParamName, out T ParamValue)
A>        {
skiped
A>            return true;
A>        }
A>


A>Хочется вставить перед try что-то в этом духе:

A>
A>if (T это string) {ParamValue=paramValue; return}
A>


можно так
для ref-type
if (typeof(string).Equals(typeof(T))) { .... }
для val-type сработает is.
if (t is int) { ... }
Re[2]: Как сделать проверку типов в generic-методе
От: aleyush Россия  
Дата: 20.01.07 09:50
Оценка:
Здравствуйте, IvanDunaev, Вы писали:

ID>Здравствуйте, aleyush, Вы писали:


A>>Хочется вставить перед try что-то в этом духе:


A>>
A>>if (T это string) {ParamValue=paramValue; return}
A>>if (T это int) return int.TryParse(paramValue, out ParamValue);
A>>


A>>Но не могу это оформить с точки зрения синтаксиса. Как это можно сделать?


ID>может, имеется в виду


ID>
ID>typeof(T) == typeof(string)
ID>


До этого я еще дошел. Но вот то, что после if, написать нее могу — получаю ошибку компилятора о невозможности приведения типа...
---
Александр Ющенко
Re[2]: Как сделать проверку типов в generic-методе
От: aleyush Россия  
Дата: 20.01.07 09:50
Оценка:
A>>Хочется вставить перед try что-то в этом духе:
A>>
A>>if (T это string) {ParamValue=paramValue; return}
A>>


В>можно так

В>для ref-type
В>if (typeof(string).Equals(typeof(T))) { .... }
В>для val-type сработает is.
В>if (t is int) { ... }

До этого я еще дошел. Но вот то, что после if, написать нее могу — получаю ошибку компилятора о невозможности приведения типа...
---
Александр Ющенко
Re[3]: Как сделать проверку типов в generic-методе
От: Lloyd Россия  
Дата: 20.01.07 09:56
Оценка:
Здравствуйте, aleyush, Вы писали:

ID>>может, имеется в виду


ID>>
ID>>typeof(T) == typeof(string)
ID>>


A>До этого я еще дошел. Но вот то, что после if, написать нее могу — получаю ошибку компилятора о невозможности приведения типа...


if (typeof(T) == typeof(string)) {ParamValue=(T)paramValue; return true;}
if (typeof(T) == typeof(int)) 
{ 
    int tmp = 0;
    bool result = int.TryParse(paramValue, out tmp);
    ParamValue = (T)tmp;
    return result;
}
Re[3]: Как сделать проверку типов в generic-методе
От: Вячеслав Украина  
Дата: 20.01.07 10:05
Оценка: 3 (1)
Здравствуйте, aleyush, Вы писали:

A>>>Хочется вставить перед try что-то в этом духе:

В>>if (t is int) { ... }

A>До этого я еще дошел. Но вот то, что после if, написать нее могу — получаю ошибку компилятора о невозможности приведения типа...


Так можно к примеру.

ParamValue = ((T)((object)int.Parse(paramValue )));
,где ParamValue объявлена как T ParamValue;

думаю преобразование не сильно тебя смутит.
Re: Как сделать проверку типов в generic-методе
От: TK Лес кывт.рф
Дата: 20.01.07 20:20
Оценка: +1
Hello, "aleyush"
> Вопрос скорее просто по синтаксису, но что-то туплю.
> P.S. Вариант сделать 3 отдельные функции понимаю, но хочется все-таки одну (к тому же на нее уже код завязан).

Если не нравятся три отдельных функции то, можно сделать четыре. Будет примерно так:

protected bool TryLoadRequestParam(string paramName, out int paramValue)
{
    return TryLoadRequestParamImpl(paramName, delegate (string arg) { return int.Parse(arg); }, out paramValue);
}

protected bool TryLoadRequestParam(string paramName, out string paramValue)
{
    return TryLoadRequestParamImpl(paramName, delegate (string arg) { return arg; }, out paramValue);
}

protected bool TryLoadRequestParam<T>(string ParamName, out T ParamValue)
{
    return TryLoadRequestParamImpl(paramName, delegate (string arg) { return Convert.ConvertTo(typeof(T), arg); }, out paramValue);
}

private bool TryLoadRequestParamImpl<T>(string ParamName, Converter<string, T> converter, out T ParamValue)
{
    ...
}
Posted via RSDN NNTP Server 2.0
Если у Вас нет паранойи, то это еще не значит, что они за Вами не следят.
Re[2]: Как сделать проверку типов в generic-методе
От: Lloyd Россия  
Дата: 20.01.07 21:44
Оценка:
Здравствуйте, TK, Вы писали:

TK>Если не нравятся три отдельных функции то, можно сделать четыре. Будет примерно так:


KISS. Зачем было так наворачивать первые два метода?
protected bool TryLoadRequestParam(string paramName, out int paramValue)
{
    return int.TryParse(Request.Params[ParamName], out paramValue);
}

protected bool TryLoadRequestParam(string paramName, out string paramValue)
{
    paramValue = Request.Params[ParamName];
    return true;
}


Будет и проще и быстрее и понятнее.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.