标签: dynamic-language-runtime

哪种动态.NET语言更有意义,Iron Ruby或Iron Python?

我想花一些时间来了解更多关于在DLR之上构建的动态语言的知识,我不确定哪种语言会更好学习.

时间有限,我真的只有时间去学习其中一个.

从长远来看,对两者中的哪一个(Iron Ruby或Iron Python)更有用的任何意见?

.net ironpython ironruby dynamic-language-runtime dynamic-languages

5
推荐指数
2
解决办法
1194
查看次数

我可以在 C# 4 中实现 method_missing 并让它实际返回一个值吗?

我试图根据 IDynamicObject 上的所有 2 篇博客文章找出如何在 C# 4 中实现 method_missing。

我想要做的是拥有一个具有存储库的业务逻辑层,如果业务逻辑层中缺少该方法,只需调用存储库并传递其结果即可。所以我有一堂课,看起来像这样:

public class CustomerServices : IDynamicObject
{
    protected CustomerRepository _Repository = new CustomerRepository();

    MetaObject IDynamicObject.GetMetaObject(Expression parameter)
    {                      
        return new RepositoryMetaObject<CustomerRepository>(_Repository, parameter);                        
    }
} 
Run Code Online (Sandbox Code Playgroud)

在 RepositoryMetaObect 中,我实现 Call 方法,如下所示:

    public override MetaObject Call(CallAction action, MetaObject[] args)
    {
        typeof(T).GetMethod(action.Name).Invoke(_Repository, getParameterArray(args));
        return this;            
    }
Run Code Online (Sandbox Code Playgroud)

(RepositoryMetaObject 代码的其余部分可能并不有趣,但我已将其包含在此处: http: //pastie.org/312842

我认为的问题是我从来没有对 Invoke 的结果做任何事情,我只是返回 MetaObject 本身。

现在当我这样做时:

        dynamic service = new CustomerServices();
        var myCustomer = service.GetByID(1); 
Run Code Online (Sandbox Code Playgroud)

GetByID 被调用,但如果我尝试访问 myCustomer 上的属性,它就会挂起。

有人可以帮忙吗?

完整代码可以在这里下载:https ://dl.getdropbox.com/u/277640/BusinessLogicLayer.zip

dynamic-language-runtime idynamicobject visual-studio-2010 c#-4.0

5
推荐指数
1
解决办法
937
查看次数

DynamicObject隐式转换

我有一个DynamicObject的子类,我想为原始类型实现隐式转换,就像DO的显式转换方法TryConvert一样; 也就是说,无需编写多个隐式运算符[type]函数.

用法:

dynamic myDynamicObject = new MyDynamicObject("1");
int sum = 1 + myDynamicObject; // instead of int i = 1 + (int)myDynamicObject;
Run Code Online (Sandbox Code Playgroud)

这可能吗?如果可能,怎么样?

.net c# casting dynamic-language-runtime dynamic

5
推荐指数
1
解决办法
1194
查看次数

C#4.0动态类型的最常见应用程序

现在,人们已经使用C#4.0的同时,我想我会看到人们是如何最常使用的类型是"动态"和为什么这帮助他们解决他们的问题比他们可能以前做了什么?

dynamic-language-runtime dynamic c#-4.0

5
推荐指数
1
解决办法
158
查看次数

5
推荐指数
1
解决办法
3659
查看次数

具有IronPython类型参数的C#泛型

所以,这种情况是我有一个名为C#泛型类Foo与模板参数T具有的new()约束。我已经声明我的班级是这样的:

class Baz
{
    public Baz() { }
}

class Foo<T>
    where T : Baz, new()
{
    // blah blah
}
Run Code Online (Sandbox Code Playgroud)

在Python中:

class Bar(Baz):
    def __init__(self):
        """ do various things here """
Run Code Online (Sandbox Code Playgroud)

但是,如果在Python中尝试这样做Foo[Bar],则会收到一条错误消息,告诉我我的Bar类违反了上的约束(即new()约束)Foo<T>

是什么赋予了?

.net c# clr ironpython dynamic-language-runtime

5
推荐指数
1
解决办法
1221
查看次数

如何在DLR中实现三元运算符

我正在使用DLR在C#中实现一个语言解释器,我在使用三元运算符时遇到了一些麻烦.此时,我已经实现了基本的函数声明/调用,如下所示:

F := (x) -> x + 1
F(1)   # returns 2
Run Code Online (Sandbox Code Playgroud)

我没有遇到函数体是一系列表达式的问题 - 总是返回最后一个表达式的值,并且我已经确保解释器中的所有情况都至少返回一些副作用.我现在正在尝试实现三元运算符(?:).我正在呈现的表达式树看起来像这样:

work = Expression.IfThenElse(                                   
    Expression.IsTrue(Expression.Convert(work, typeof(Boolean))), 
    trueExp, 
    falseExp);
Run Code Online (Sandbox Code Playgroud)

其中trueExp和falseExp都是有效的表达式.

问题似乎是IfThenElse表达式没有返回值,所以基本上即使trueExp和falseExp构建表达式树,IfThenElse表达式的最终结果始终为null.如果没有制作运行时功能并明确调用它,有没有办法使用DLR实现三元运算符?(即:表达式.执行IfThenElse并返回true和false子句中的实际值?)

我希望解析的是:

F := (x) -> (x = 1) ? 4 : 5
F(1)   #4
F(2)   #5
Run Code Online (Sandbox Code Playgroud)

但是由于上面列出的问题,现在这在编译成程序时总是返回null.

我很感激任何帮助,这很令人烦恼!

dynamic-language-runtime ternary-operator

5
推荐指数
1
解决办法
1526
查看次数

使用DLR运行用CompileAssemblyFromSource生成的代码?

继续这个优秀的答案,我想知道使用dynamic关键字的DLR是否允许更简洁的方式为生成的程序集编写代码.

例如,上述答案的代码可以:

using (Microsoft.CSharp.CSharpCodeProvider foo = 
           new Microsoft.CSharp.CSharpCodeProvider())
{
    var res = foo.CompileAssemblyFromSource(
        new System.CodeDom.Compiler.CompilerParameters() {  
            GenerateInMemory = true 
        }, 
        "public class FooClass { public string Execute() { return \"output!\";}}"
    );

    var type = res.CompiledAssembly.GetType("FooClass");
    var obj = Activator.CreateInstance(type);
    var output = type.GetMethod("Execute").Invoke(obj, new object[] { });
}
Run Code Online (Sandbox Code Playgroud)

变成这样的东西:

using (Microsoft.CSharp.CSharpCodeProvider foo = 
           new Microsoft.CSharp.CSharpCodeProvider())
{
    var res = foo.CompileAssemblyFromSource(
        new System.CodeDom.Compiler.CompilerParameters() {  
            GenerateInMemory = true 
        }, 
        "public class FooClass { public string Execute() { return …
Run Code Online (Sandbox Code Playgroud)

.net c# codedom dynamic-language-runtime

5
推荐指数
1
解决办法
1802
查看次数

C#DLR,使用Dynamic关键字进行数据类型推断

只是问问而已 :

为什么'withOffset'变量被推断为动态,因为Parse方法返回Struct

dynamic str = "22/11/2013 10:31:45 +00:01";
var withOffset = DateTimeOffset.Parse(str);
Run Code Online (Sandbox Code Playgroud)

并在明确地将其退回到Struct之后?

dynamic str = "22/11/2013 10:31:45 +00:01";
var withOffset = DateTimeOffset.Parse((string)str);
Run Code Online (Sandbox Code Playgroud)

因为DateTimeOffset.Parse的返回类型是DateTimeOffset,并且编译器必须知道.记住这一点,它在运行时调用的任何方法,返回始终是DateTimeOffset.

规格说明

由于您的方法将dynamic作为参数,因此它符合"动态绑定"的条件

有点可疑.

有这样的规范有什么意义?或者在什么情况下DateTimeOffset.Parse不会返回STRUCT(暂时忘记DLR ..)?

编译器需要聪明,如果类中的所有方法/重载具有相同的返回类型以从长远来看获得性能优势.

.net c# dynamic-language-runtime

5
推荐指数
1
解决办法
570
查看次数

实体框架代码首先和ironpython

是否可以将Entity Framework 6与代码第一模式一起使用,并在C#和IronPython中编写模型?

背景是,c#core中定义了一些标准模型,并且必须在IronPython中定义一些自定义模型.

编辑

定制模型在我们的定制生产系统中定义.应该加载模型并将其添加到DbContext应用程序启动时.每个模型都是一个IronPython文件/模块,将从数据库加载(与所有其他脚本一样).

不工作的样品

Program.cs中

using IronPython.Hosting;
using Microsoft.Scripting.Hosting;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace IronPython_EF
{
    class Program
    {
        // Private Member
        private static SampleContext context;

        static void Main(string[] args)
        {
            // Setup EntityFramework
            context = new SampleContext();

            // Create IronPython
            var setup = Python.CreateRuntimeSetup(null);
            var runtime = new ScriptRuntime(setup);
            var engine = runtime.GetEngine("IronPython");
            var scriptScope = engine.CreateScope();

            // Set global var
            scriptScope.SetVariable("DBContext", context);

            // Load Model
            ScriptSource modelSource …
Run Code Online (Sandbox Code Playgroud)

c# ironpython entity-framework dynamic-language-runtime sqlanywhere

5
推荐指数
1
解决办法
957
查看次数