Как я добираюсь от типа до метода TryParse?

У вас могут быть некоторые проблемы там.

Сначала будет ситуация TimeOut. Возможно, что из-за некоторых проблем в Интернете время между запросом и ответом больше указанного (я полагаю, что если вы этого не сделаете, по умолчанию установлено значение 60 секунд).

Другое дело, что размер файла может быть слишком большим, чтобы писать полностью в одном ответе пакета. Но это может произойти при любом запросе, не только в «плохие» моменты подключения к Интернету.

Также возможно, что, поскольку интернет-соединение нестабильно, ваш «сервер» обнаруживает, что «клиент» не распознал (даже кратко), поэтому закрыл сокет.

8
задан Brendan 24 January 2009 в 10:11
поделиться

5 ответов

Как многие сказали - нет прямого маршрута. Я ожидаю, что одна близкая опция TypeConverter:

    Type type = typeof(double);
    string text = "123.45";

    object value = TypeDescriptor.GetConverter(type)
        .ConvertFromInvariantString(text);

Конечно, Вам, возможно, понадобится try/catch обрабатывать исключения.Такова жизнь.

20
ответ дан 3 November 2019 в 12:57
поделиться
1
ответ дан 3 November 2019 в 12:57
поделиться

ОТРЕДАКТИРОВАННЫЙ: Я удалил универсальную реализацию и очистил этот ответ для установки лучше к первоначально установленной проблеме.

Примечание: Ответ 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 };
5
ответ дан 3 November 2019 в 12:57
поделиться

Как я добираюсь от того типа до способности использовать, Система. Нечто. 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, можно легко достигнуть способности написать клиентский код, который работает со статическими типами... Пока они соответствуют или могут быть преобразованы в от типов, Вы анализируете.

7
ответ дан 3 November 2019 в 12:57
поделиться

И еще одна хорошая связь с этой проблемой . Исходный код на этом сайте очень плохо отформатирован, поэтому я поместил его сюда. Надеюсь, автор не подаст на меня в суд.

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;
        }
    }
}
2
ответ дан 3 November 2019 в 12:57
поделиться
Другие вопросы по тегам:

Похожие вопросы: