我正在尝试访问IronPython中的.Net(C#)枚举,假设我们已经
Test.dll的
// Contains Several Enums
enum TestType{..}
enum TestQuality{..}
....
....
enum TestStatus{..}
//Similarly Multiple functions
public void StartTest(TestType testType, TestQuality testQuality){..}
....
....
public TestStatus GetTestStatus(){..}
现在如果我尝试调用上面的函数,我需要选择适当的枚举参数,到目前为止我所做的就是这个,
Iron Python [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代码运行正常,这里唯一奇怪的是我需要启动所有枚举(Intellisence在这里不起作用),然后再将它们与函数一起使用,当有更多的枚举时,这将变得更加困难使用。而在C#环境(vs2012)中,我们不必启动,但我们可以在调用函数时立即使用它们。
在IronPython中有更好的方法吗?
如果我错了请纠正我,谢谢!
答案 0 :(得分:2)
假设枚举包含在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)
答案 1 :(得分:0)
我遇到了同样的问题,但是我用另一种方法解决了:使用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