Методы расширения действительно ли C# могут получить доступ к частным переменным?

Вы можете скачать tika-app-xxx.jar (последний) из Здесь .

Затем поместите этот .jar-файл в ту же папку вашего файла сценария python.

затем вставьте следующий код в скрипт:

import os
import os.path

tika_dir=os.path.join(os.path.dirname(__file__),'.jar')

def extract_pdf(source_pdf:str,target_txt:str):
    os.system('java -jar '+tika_dir+' -t {} > {}'.format(source_pdf,target_txt))

Преимущество этого метода:

меньше зависимости. Один файл .jar проще управлять пакетом python.

поддержка нескольких форматов. Позиция source_pdf может быть каталогом любого документа. (.doc, .html, .odt и т. д.)

. tika-app.jar всегда выпускает ранее, чем соответствующая версия пакета tika python.

стабильный.

Недостаток:

Необходим jre-headless.

68
задан Geo 10 October 2009 в 16:02
поделиться

5 ответов

Нет. В методе расширения вы можете сделать то же самое, что и в «обычном» статическом методе в некотором служебном классе.

Таким образом, этот метод расширения

public static void SomeMethod(this string s)
{
    // do something with 's'
}

эквивалентен некоторому статическому вспомогательному методу, подобному этому (по крайней мере, в отношении того, к чему вы можете получить доступ) :

public static void SomeStringMethod(string s)
{
    // do something with 's'
}

(Конечно, вы можете использовать отражение в любом методе для доступа к закрытым членам. Но я думаю, что не в этом суть вопроса.)

72
ответ дан 24 November 2019 в 14:17
поделиться

Если у вас есть класс, который вы расширяете, вы всегда объявляете его частичным, а затем расширяете класс & amp; иметь доступ ко всем закрытым членам в другом файле ... Но вы бы не использовали методы расширения.

2
ответ дан Rimbimbambo 7 November 2019 в 10:19
поделиться

Нет:

public class Foo
{
    private string bar;
}

public static class FooExtensions
{
    public static void Test(this Foo foo)
    {
        // Compile error here: Foo.bar is inaccessible due to its protection level  
        var bar = foo.bar;
    }
}
11
ответ дан 24 November 2019 в 14:17
поделиться

Нет, если вы не предоставите какой-либо доступ к ним через общедоступные свойства или шаблон прокси.

3
ответ дан 24 November 2019 в 14:17
поделиться

Метод расширения - это, по сути, статический метод, поэтому все, к чему у вас есть доступ, - это открытые члены экземпляра, для которого вызывается метод расширения

0
ответ дан 24 November 2019 в 14:17
поделиться
Другие вопросы по тегам:

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