Джеки,
Это очень распространенное требование в мире веб-разработки, и, как вы заметили, нет встроенного способа для достижения этого, а то, что есть, не дается в простейших случаях.
@ Крис, эти правила не произвольны ни одним выстрелом воображения.На самом деле они очень распространены, когда дело доходит до пользовательского ввода, особенно через Интернет.На самом деле, логические преобразования также довольно распространены, учитывая, что флажки в ASP.NET возвращаются вкл / выкл (по некоторым причинам).
У вас есть несколько вариантов.Один - это упрощенный подход, а другой - расширяемое решение.Все начинается с того, как вы хотите использовать эту функцию в своем приложении.Поскольку вы не пролили много света на то, что вы делаете в данный момент или как бы вы хотели это сделать, я позволил себе сделать несколько предположений.
Основное предположение заключается в том, чточто значения приходят к вам через Request.Form или Request.QueryStrings (оба из которых являются NameValueCollections, которые могут содержать несколько значений для данного имени).
Предположим, вам нужен метод с именем ChangeType, который даетимя параметров и тип, на который вы хотите изменить его, вернут значение в качестве требуемого типа.Таким образом, сигнатура метода может выглядеть следующим образом:
public T ChangeType<T>(string parameterName, T defaultValue = default(T))
И поэтому вы можете использовать его так:
int someId = ChangeType<int>("id", -1);
Таким образом, значение переменной someId будетлибо значение, извлеченное из Request.Form или Request.QueryStrings в форме типа int (если оно существует), либо -1, если его нет.
Более полная реализация выглядит следующим образом:
static T ChangeType<T>(string value) where T: struct
{
Type typeOft = typeof(T);
if (String.IsNullOrEmpty(value.Trim()))
return default(T);
if (typeOft == typeof(Int32))
return (T)ConvertToInt32(value);
else if (typeOft == typeof(Int64))
return (T)ConvertToInt64(value);
else if (typeOft == typeof(Double))
return (T)ConvertToDouble(value);
else if (typeOft == typeof(Decimal))
return (T)ConvertToDecimal(value);
return default(T);
}
static object ConvertToInt32(string value)
{
return Int32.Parse(value,
NumberStyles.Currency ^ NumberStyles.AllowDecimalPoint);
}
static object ConvertToInt64(string value)
{
return Int64.Parse(value,
NumberStyles.Currency ^ NumberStyles.AllowDecimalPoint);
}
static object ConvertToDouble(string value)
{
return Double.Parse(value, NumberStyles.Currency);
}
static object ConvertToDecimal(string value)
{
return Decimal.Parse(value, NumberStyles.Currency);
}
Если вам нужно обрабатывать больше типов, просто реализуйте требуемый метод (например, ConvertToInt32) и добавьте еще одно условие else в метод ChangeType<T>
, и все готово.
Теперь, если вы ищете расширяемое решение, чтобы вы могли добавить дополнительные возможности без необходимости изменять основной код и иметь возможность обрабатывать ваши собственные пользовательские типы, тогда, пожалуйста, взгляните на мой блог.[ChangeType - Изменение типа переменной в C #] [1] http://www.matlus.com/2010/11/changetypet-changing-the-type-of-a-variable-in-c/
Надеюсь, это поможет.