Как я могу преобразовать в определенный тип в универсальной версии TryParse ()?

Исходный код, казалось, был приспособлен для исполняемого файла, Вы, возможно, должны были бы повторно соединить проводом, наполняет немного так, он создал бы как DLL вместо этого. У меня нет большого опыта с Visual C++, но я думаю, что это не должно быть слишком твердо с некоторым исследованием. Мое предположение - то, что кто-то, возможно, имел уже, сделал версию библиотеки, необходимо попробовать Google.

, Как только у Вас есть код tesseract-ocr в файле DLL, можно тогда импортировать файл в проект C# с помощью Visual Studio и иметь его, создают классы обертки и делают все материалы маршалинга для Вас. Если Вы не можете импортировать тогда , DllImport позволит Вам вызвать функции в DLL от кода C#.

Тогда можно смотреть на исходный исполняемый файл для нахождения подсказок о какой функции назвать к правильно OCR изображение в формате TIFF.

19
задан Shog9 10 July 2009 в 00:05
поделиться

4 ответа

t = результат? (T) typedValue: по умолчанию (T);

Попробуйте:

t = result ? (T)(object)typedValue : default(T);

Да, дженерики иногда могут раздражать.

FWIW, я использую гораздо более простую оболочку вокруг Convert.ChangeType () , которая просто выполняет предварительная проверка на пустые строки. Если вы не используете это для непроверенного ввода пользователя, этого, вероятно, будет достаточно.

40
ответ дан 30 November 2019 в 02:14
поделиться

Почему бы просто не использовать отражение и не использовать встроенные методы TryParse? Практически по одному для каждого собственного типа, за исключением Guid.

public static Parser<T> GetParser<T>(T defaultResult)
    where T : struct
{
    // create parsing method
    Parser<T> parser = (string value, out T result) =>
    {
        // look for TryParse(string value,out T result)
        var parseMethod = 
            typeof(T).GetMethods()
                     .Where(p => p.Name == "TryParse")
                     .Where(p => p.GetParameters().Length == 2)
                     .Single();

        // make parameters, leaving second element uninitialized means out/ref parameter
        object[] parameters = new object[2];
        parameters[0] = value;

        // run parse method
        bool success = (bool)parseMethod.Invoke(null, parameters);

        // if successful, set result to output
        if (!success)
        {
            result = (T)parameters[1];
        }
        else
        {
            result = defaultResult;
        }

        return success;
    };

    return parser;
}
1
ответ дан 30 November 2019 в 02:14
поделиться

Учитывая это:

следовательно, T будет любым из следующих: int, uint, short, ushort, long, ulong, byte, sbyte, decimal, float, double.

Я бы рекомендовал просто использовать Convert.ChangeType и не беспокоиться об этом. Единственный раз, когда вы получите исключение, это когда ваша строка неправильно отформатирована, и в этом случае вы можете вернуть значение по умолчанию (T).

т.е.

try
{
    result = Convert.ChangeType(value, typeof(T));
}
catch
{
    result = default(T);
}
12
ответ дан 30 November 2019 в 02:14
поделиться

ToType является здесь общим параметром. Это работает для типов, допускающих значение NULL, на всякий случай, если вам это нужно. Вы можете извлечь свой основной метод в общий преобразователь, который будет преобразовывать в любой тип, включая значения NULL.

    ToType result = default(ToType);    

    result = ChangeType<ToType>(typedValue);


  private T ChangeType<T>(object o)
{
   Type conversionType = Nullable.GetUnderlyingType(typeof(T)) ?? typeof(T);
   return (T)Convert.ChangeType(o, conversionType);
}
5
ответ дан 30 November 2019 в 02:14
поделиться
Другие вопросы по тегам:

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