Использование scope.set для назначения класса stati c вместо переменной - PullRequest
0 голосов
/ 26 апреля 2020

Я пытаюсь передать класс c c# в python, используя pytho nnet. Я могу использовать scope.Set ("person", pyPerson) аналогично примеру ниже. Однако в моем случае это служебный класс (stati c), и я получаю сообщение об ошибке, что util не содержит testfn в примере ниже.

using Python.Runtime;

// create a person object
Person person = new Person("John", "Smith");

// acquire the GIL before using the Python interpreter
using (Py.GIL())
{
// create a Python scope
using (PyScope scope = Py.CreateScope())
{
 // convert the Person object to a PyObject
   PyObject pyPerson = person.ToPython();

   // create a Python variable "person"
   scope.Set("person", pyPerson); //<------ this works
   scope.Set("util", Utility); //<------ Utility is a static class whose method I am trying to call 
                               //and this does not  work.

   // the person object may now be used in Python
   string code = "fullName = person.FirstName + ' ' + person.LastName"; //<--- works
   code = "util.testfn();" //testfn is a static class, How do I do this ?
   scope.Exec(code);`enter code here`
  }
 }

1 Ответ

0 голосов
/ 26 апреля 2020

Если вам нужно использовать несколько методов из вашего класса Utility, этот пост может помочь:

Python для. NET: Как вызвать метод класса c using Reflection?

Более удобный способ, если вам просто нужно вызвать один метод, - передать делегат. Объявите делегата на уровне класса;

delegate string testfn();

И передайте указатель функции в область:

scope.Set("testfn", new testfn(Utility.testfn));

В этом случае вы сможете напрямую вызывать этот метод:

code = @"print(testfn())";

Вывод: (testfn () возвращает «Result of testfn ()»)

C:\Temp\netcore\console>dotnet run
Result of testfn()
...