2011-06-04 37 views
5

C# sınıfına IronPython komut dosyasından nasıl erişirim? C#:IronPython komut dosyasından erişim ana sınıfı sınıfı

public class MyClass 
{ 
} 

public enum MyEnum 
{ 
    One, Two 
} 

var engine = Python.CreateEngine(options); 
var scope = engine.CreateScope(); 
scope.SetVariable("t", new MyClass()); 
var src = engine.CreateScriptSourceFromFile(...); 
src.Execute(scope); 

IronPython komut:

class_name = type(t).__name__  # MyClass 
class_module = type(t).__module__ # __builtin__ 

# So this supposed to work ... 
mc = MyClass() # ??? 
me = MyEnum.One # ??? 

# ... but it doesn't 

GÜNCELLEME Ben barındırma derlemede tanımlanmış sınıfları ithalat gerekir

.

cevap

3

Bir örneği MyClass ait için t kurdum, ancak bunu kendisi grup sanki kullanmaya çalışıyoruz.

IronPython komut dosyanızdan MyClass içeri aktarmanız veya bir tür fabrika yöntemi enjekte etmeniz gerekir (sınıflar C# sınıfındaki birinci sınıf nesneler olmadığından, doğrudan MyClass'dan geçemezsiniz). Alternatif olarak, bir örnek oluşturmak için typeof(MyClass)'dan geçebilir ve System.Activator.CreateInstance(theMyClassTypeObject)'u kullanabilirsiniz.

da erişmek gerekir beri MyEnum (bunu nereden gelebilir herhangi bir referans olmadan bir senaryoya kullandığınız dikkat edin), sadece kullanmanızı öneririz ithalatı:

import clr 
clr.AddReference('YourAssemblyName') 

from YourAssemblyName.WhateverNamespace import MyClass, MyEnum 

# Now these should work, since the objects have been properly imported 
mc = MyClass() 
me = MyEnum.One 

Oynamak gerekebilir komut dosyası kaynak türüyle (Bence File en iyi çalışır) ve başarılı olmak için clr.AddReference() çağrısı almak için komut dosyası yürütme yolu ile.

+0

Harici bir gruptan bir sınıf alabilirim. Ama barındırma meclisinden bir sınıf kullanmam gerekiyor. Python komut dosyasını başlatan. İthalatla oynamayı denedim, ancak bunu yapmanın bir yolunu bulamadım. – Max

+0

@Max: Barındırma meclisi hiçbir şekilde özel değildir - diğer meclislerden olduğu gibi ondan da içe aktarmanız gerekir. DLL dosyasının sonuna kadar tam ve mutlak yolunu 'AddReference()' çağrısına koyabilirsiniz - eğer çalışırsa, o zaman sadece bir yol/güncel dizin sorunu olduğunu biliyorsunuz (ki bu can sıkıcı olabilir, ama en azından bunu anlayacaksınız) kod çalışıyor veya çalışmıyor) – Cameron

+0

Komut dosyası barındırıldığından beri, barındırma derlemesini almam gerekmediğinden emindim. Ve şimdi denedim ki çalışıyorum. Sınıf örneğini ve sorgulanan sınıf adını ve modülünü geçtiğimde, sınıfın zaten bir genel ad alanının parçası gibi göründüğünden gariptir. – Max