我正在尝试创建一个 Dsl,该 Dsl 将具有位于单个 Dsl .rb 文件中的实例,然后从 CLR 运行它们。
我想在 IronRuby 中创建和设置 Clr 对象的值,然后在 .rb Dsl 实例文件运行后以某种方式访问 CLR 对象。
这是我的 Clr 对象,目前非常简单:
namespace Horn.Core.Dsl
{
public class BuildMetaData : IBuildMetaData
{
public string Description { get; set; }
}
}
我有以下模块用于指定我的 Dsl 并将创建上面指定的 BuildMetaData 的实例:
module MetaBuilder
module Dsl
module Main
attr_accessor :metadata
def install(name, &block)
@metadata = Horn::Core::Dsl::BuildMetaData.new
yield self if block_given?
end
def description(desc)
@metadata.Description = desc
end
def get_metadata
@metadata
end
end
end
end
include MetaBuilder::Dsl::Main
在 Dsl 的实例运行后,我以某种方式希望能够从 Clr 代码中获取 @metadata 属性。
目前 Dsl 的一个实例如下所示:
install :horn do
description "A .NET build and dependency manager"
end
我的 C# 代码目前如下所示:
var engine = Ruby.CreateEngine();
engine.Runtime.LoadAssembly(typeof(BuildMetaData).Assembly);
engine.ExecuteFile(buildFile);
var klass = engine.Runtime.Globals.GetVariable("get_metadata");
无论如何我可以在不污染 Dsl 实例的情况下获得@metadata 属性吗?