我想花一些时间来了解更多关于在DLR之上构建的动态语言的知识,我不确定哪种语言会更好学习.
时间有限,我真的只有时间去学习其中一个.
从长远来看,对两者中的哪一个(Iron Ruby或Iron Python)更有用的任何意见?
.net ironpython ironruby dynamic-language-runtime dynamic-languages
我试图根据 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
我有一个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)
这可能吗?如果可能,怎么样?
现在,人们已经使用C#4.0的同时,我想我会看到人们是如何最常使用的类型是"动态"和为什么这帮助他们解决他们的问题比他们可能以前做了什么?
有人可以解释一下DLR是什么以及它在短信网关中的用途?
所以,这种情况是我有一个名为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>。
是什么赋予了?
我正在使用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关键字的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) 只是问问而已 :
为什么'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 ..)?
编译器需要聪明,如果类中的所有方法/重载具有相同的返回类型以从长远来看获得性能优势.
是否可以将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
.net ×5
c# ×5
ironpython ×3
c#-4.0 ×2
dynamic ×2
casting ×1
clr ×1
codedom ×1
ironruby ×1
sqlanywhere ×1