У вас могут быть некоторые проблемы там.
Сначала будет ситуация TimeOut. Возможно, что из-за некоторых проблем в Интернете время между запросом и ответом больше указанного (я полагаю, что если вы этого не сделаете, по умолчанию установлено значение 60 секунд).
Другое дело, что размер файла может быть слишком большим, чтобы писать полностью в одном ответе пакета. Но это может произойти при любом запросе, не только в «плохие» моменты подключения к Интернету.
Также возможно, что, поскольку интернет-соединение нестабильно, ваш «сервер» обнаруживает, что «клиент» не распознал (даже кратко), поэтому закрыл сокет.
Как многие сказали - нет прямого маршрута. Я ожидаю, что одна близкая опция TypeConverter
:
Type type = typeof(double);
string text = "123.45";
object value = TypeDescriptor.GetConverter(type)
.ConvertFromInvariantString(text);
Конечно, Вам, возможно, понадобится try
/catch
обрабатывать исключения.Такова жизнь.
это может помочь: http://theengineroom.provoke.co.nz/archive/2007/04/27/generic-tryparse-type-conversion.aspx
ОТРЕДАКТИРОВАННЫЙ: Я удалил универсальную реализацию и очистил этот ответ для установки лучше к первоначально установленной проблеме.
Примечание: Ответ Marc Gravell является, вероятно, самым кратким, если Вы просто хотите проанализированное значение, учитывая тип. Ответ ниже показывает Вам, как достигнуть метод (т.е. объект MethodInfo и как вызвать его).
Следующее должно работать, по крайней мере, для типов, которые реализуют общедоступный статический bool TryParse (строка, T значение):
public static class Parsing
{
static MethodInfo findTryParseMethod(Type type)
{
//find member of type with signature 'static public bool TryParse(string, out T)'
BindingFlags access = BindingFlags.Static | BindingFlags.Public;
MemberInfo[] candidates = type.FindMembers(
MemberTypes.Method,
access,
delegate(MemberInfo m, object o_ignored)
{
MethodInfo method = (MethodInfo)m;
if (method.Name != "TryParse") return false;
if (method.ReturnParameter.ParameterType != typeof(bool)) return false;
ParameterInfo[] parms = method.GetParameters();
if (parms.Length != 2) return false;
if (parms[0].ParameterType != typeof(string)) return false;
if (parms[1].ParameterType != type.MakeByRefType()) return false;
if (!parms[1].IsOut) return false;
return true;
}, null);
if (candidates.Length > 1)
{
//change this to your favorite exception or use an assertion
throw new System.Exception(String.Format(
"Found more than one method with signature 'public static bool TryParse(string, out {0})' in type {0}.",
type));
}
if (candidates.Length == 0)
{
//This type does not contain a TryParse method - replace this by your error handling of choice
throw new System.Exception(String.Format(
"Found no method with signature 'public static bool TryParse(string, out {0})' in type {0}.",
type));
}
return (MethodInfo)candidates[0];
}
public static bool TryParse(Type t, string s, out object val)
{
MethodInfo method = findTryParseMethod(t); //can also cache 'method' in a Dictionary<Type, MethodInfo> if desired
object[] oArgs = new object[] { s, null };
bool bRes = (bool)method.Invoke(null, oArgs);
val = oArgs[1];
return bRes;
}
//if you want to use TryParse in a generic syntax:
public static bool TryParseGeneric<T>(string s, out T val)
{
object oVal;
bool bRes = TryParse(typeof(T), s, out oVal);
val = (T)oVal;
return bRes;
}
}
Используйте следующий тестовый код:
public bool test()
{
try
{
object oVal;
bool b = Parsing.TryParse(typeof(int), "123", out oVal);
if (!b) return false;
int x = (int)oVal;
if (x!= 123) return false;
}
catch (System.Exception)
{
return false;
}
try
{
int x;
bool b = Parsing.TryParseGeneric<int>("123", out x);
if (!b) return false;
if (x != 123) return false;
}
catch (System.Exception)
{
return false;
}
try
{
object oVal;
bool b = Parsing.TryParse(typeof(string), "123", out oVal);
//should throw an exception (//no method String.TryParse(string s, out string val)
return false;
}
catch (System.Exception)
{
//should throw an exception
}
return true;
}
}
И используйте это в своем случае:
//input: string s, Config
Type tNum = Type.GetType(Config.numberType);
object oVal;
bool ok = Parsing.TryParse(tNum, s, out oVal);
//oVal is now of type tNum and its value is properly defined if ok == true
Об использовании var: у Вас может быть неправильное представление того, что делает var: Это не "различный" тип (текстовый объект уже используется для того), но перемещает синтаксис объявления для типа к правой стороне присвоения. Следующие объявления эквивалентны:
var i = 1; //the compiler infers the type from the assignment, type of i is int.
int i = 1; //type of i is int via declaration
Основное использование var позволяет создавать анонимные типы:
var anon = new { Name = "abc", X = 123 };
Как я добираюсь от того типа до способности использовать, Система. Нечто. TryParse ()?
Необходимо будет использовать отражение, чтобы искать и затем вызвать помехи TryParse()
метод. Не все типы реализуют этот метод - таким образом, необходимо будет решить, как обработать его, если он отсутствует. Вы могли также использовать System.Convert
преобразовать строку в произвольный тип, принимая строку - на самом деле допустимое представление значения для того типа и существует преобразование, реализованное для него.
К TryParse () можно получить доступ от Системы. Нечто. TryParse (), а также нечто. TryParse (). Это означает, что нечто является некоторым классом в C#?
int
, double
, и т.д. псевдонимы для System.Int32
, System.Double
, и т.д. - они - часть языка C#, который был бы неприятно подробным без них.
Как можно объявить переменные при этих обстоятельствах?
Не зная тип во время компиляции, Вы будете вынуждены объявить и работать с Вашими данными как object
/ System.Object
. C# 4.0 представит фактические динамические типы, которые будут заботиться о части утомительной отражательной работы для Вас, но на данный момент Вы застреваете, делая его вручную. Обратите внимание на это, если Вы используете System.Convert
в методе с параметрическим аргументом типа и возвратом, или TryParse()
с помощью техники, такой как связанный с Sebastian Sedlak, можно легко достигнуть способности написать клиентский код, который работает со статическими типами... Пока они соответствуют или могут быть преобразованы в от типов, Вы анализируете.
И еще одна хорошая связь с этой проблемой . Исходный код на этом сайте очень плохо отформатирован, поэтому я поместил его сюда. Надеюсь, автор не подаст на меня в суд.
public static T Parse<T>(string s)
{
Type t = typeof(T);
// Attempt to execute the Parse method on the type if it exists.
MethodInfo parse = t.GetMethod("Parse", new Type[] { typeof(string) });
if (parse != null)
{
try
{
return (T)parse.Invoke(null, new object[] { s });
}
catch (Exception ex)
{
throw ex.InnerException;
}
}
else
{
throw new MethodAccessException(String.Format("The Parse method does not exist for type {0}.", t.Name));
}
}
public static bool TryParse<T>(string s, out T result)
{
return TryParse<T>(s, false, out result);
}
public static bool TryParse<T>(string s, bool throwException, out T result)
{
result = default(T);
Type t = typeof(T);
T type = default(T);
// Look for the TryParse method on the type.
MethodInfo tryParse = t.GetMethod("TryParse", new Type[] { typeof(string), Type.GetType(t.FullName + "&") });
if (tryParse != null)
{
// Try parse exists. Call it.
Object[] ps = new Object[2];
ps[0] = s;
bool isSuccess = (bool)tryParse.Invoke(type, ps);
if (isSuccess)
result = (T)ps[1];
return isSuccess;
}
else
{
// TryParse does not exist. Look for a Parse method.
try
{
result = Parse<T>(s);
return true;
}
catch
{
if (throwException)
throw;
return false;
}
}
}