访问Iron python中的.Net枚举

时间:2014-11-19 12:58:10

标签: c# .net ironpython

我正在尝试访问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中有更好的方法吗?

如果我错了请纠正我,谢谢!

2 个答案:

答案 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