2

阅读这篇文章和链接后,我还有 2 个问题

问题 #1

有什么标准可以让我在 c#中执行动态代码?目标类/对象必须依赖.net clr 吗?我的意思是,如果有人给我一个 Pascal DLL,我想我将无法通过动态(或将?)使用它的代码。所以:动态工作的要求是什么?

问题2

例如:在脚本对象中 - 为了增加一个 int 代码应该是:

 Scriptobj.SetProperty("Count", ((int)GetProperty("Count")) + 1);

有了动态我可以做到:

scriptobj.Count += 1;

这是否意味着 scriptobj 的类程序员编写了支持DLR的代码=+1

ScriptobjClass : DynamicObject
{
  ...
  public override bool TryInvokeMember (...when +=1 so do a+1....)...
}

我在这里错过了一些必不可少的东西。

是不是就像:“我们正在构建一个类,但我们也应该让 .net DLR 访问它——所以让我们编写更多代码,以便这个类也支持 允许 .net 用户通过 dlr 访问这个类的操作”?

4

1 回答 1

3

让我们首先解释 DLR 允许您做什么,首先:

DLR 有两个方面,第一个是它允许在运行时动态绑定对象。例如:

class A
{
    public int SomeProperty { get; set; }
}

class B
{
    public int SomeMethod(int value)
    {
        return value;
    }
}


dynamic d = new A();
d.Value = 1;

d = new B();
d.SomeMethod(2);

动态 d 可以分配任何类型的对象并调用它们的方法和属性。一个更引人注目的例子:

int CallSomeMethod(dynamic d)
{
    return d.SomeMethod();
}

这适用于任何具有返回 int 的方法“SomeMethod”的类。执行此操作的强类型方法是使用“SomeMethod”创建一个接口:

int CallSomeMethod(IClassWithSomeMethod d)
{
    return d.SomeMethod();
}

请注意,这不是以前使用反射无法完成的事情,但是 DLR 和 dynamic 关键字使这变得更简单。DLR 还为调用创建和缓存表达式树,因此使用 DLR 几乎总是比反射更有效。

然而,DLR 的真正优势不仅仅是运行时绑定,它实际上允许您创建动态行为的对象。基本上,它允许您指定当您调用绑定到动态变量的实际运行时对象中不存在的方法或属性时会发生什么。这允许 CLR 用于动态语言并提供与动态语言的轻松互操作,创建易于使用的解析器,可以将 DOM 表示为动态对象或 ORM,可以将临时查询表示为对象等。

有关 DLR 的更多详细信息,请参见其codeplex 项目文档页面。特别值得一提的是概述站点、绑定器和动态对象互操作规范文档。

现在回答你的问题:

问题 1:不,您不能通过魔法与任何动态语言进行交互,必须有一些受支持的互操作(可能由 DLR 促进)才能这样做(我不知道您所说的 Pascal dll 是什么意思。)

问题 2:ScriptObjectClass 使用 DLR 工具(通过扩展 DynamicObject)来动态获取和设置 Count 属性,就好像它是 ScriptObjectClass 的实际属性一样(如果您好奇,请参阅Sites、Binders 和 Dynamic Object Interop Spec以了解具体如何已经完成了。)

于 2012-12-19T00:39:50.600 回答