在 Iron Python 中访问 .Net 枚举
本文关键字:Net 枚举 访问 Iron Python | 更新日期: 2023-09-27 18:31:03
我正在尝试访问IronPython中的.Net(C#)枚举,假设我们有
测试.dll
// Contains Several Enums
enum TestType{..}
enum TestQuality{..}
....
....
enum TestStatus{..}
//Similarly Multiple functions
public void StartTest(TestType testType, TestQuality testQuality){..}
....
....
public TestStatus GetTestStatus(){..}
现在,如果我尝试调用上述函数,我需要选择合适的枚举参数,到目前为止我所做的是这样的,
铁蟒 [vs2012]
import clr
clr.AddReference('Test.dll')
from TestDll import *
test = Test()
# Initiate Enums
enumTestType = TestType
enumTestQuality = TestQuality
....
....
enumTestStatus = TestStatus
#Call Functions
test.StartTest(enumTestType.Basic, enumTestQuality.High)
....
....
# goes on
现在上面的 IronPython 代码工作正常,这里唯一的奇怪一点是我需要启动所有枚举(智能在这里不起作用),然后再将它们与函数一起使用,当有更多的枚举可以使用时,这将变得更加困难。 而在 C# 环境(vs2012) 中,我们不必启动,但我们可以在调用函数时直接使用它们。
在IronPython中是否有更好的处理方法?
如果我错了,请纠正我,谢谢!
假设枚举包含在您的Test
类中,您可以使用它们完全限定
test.StartTest(Test.TestType.Basic, Test.TestQuality.High)
或通过导入
from TestDll.Test import TestQuality, TestType
test.StartTest(TestType.Basic, TestQuality.High)
如果枚举与 Test
类位于同一命名空间中,则无需其他导入即可使用枚举:
test.StartTest(TestType.Basic, TestQuality.High)
我遇到了同样的问题,但我以另一种方式修复了它:使用 ScriptRuntime.LoadAssembly
.
先决条件:
-
VS2013
-
C# 应用可执行文件,以及 Test.dll 程序集。IronPython由C#应用程序托管。
-
Test.dll:(请注意,所有内容都在 TestDll 命名空间中)
namespace TestDll { // Contains Several Enums enum TestType{..} enum TestQuality{..} .... .... enum TestStatus{..} //Similarly Multiple functions public void StartTest(TestType testType, TestQuality testQuality){..} .... .... public TestStatus GetTestStatus(){..} }
我只是这样简单地创建了IronPython引擎:
eng = Python.CreateEngine();
eng.Runtime.LoadAssembly(Assembly.GetAssembly(typeof(TestType))); // This allows "from TestDLL import *" in Python scripts
然后,用通常的
string pysrc = ...; // omitted, taken from the python script below
ScriptSource source = eng.CreateScriptSourceFromString(pysrc);
ScriptScope scope = eng.CreateScope();
source.Execute(scope);
这允许我编写此 Python 代码并在 C# 应用程序中执行它:(请注意,我直接使用枚举名称)
from TestDll import *
test = Test()
#Call Functions
test.StartTest(TestType.Basic, TestQuality.High)
....
....
# goes on