让我们首先解释一下 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 和动态关键字使这变得更加简单。 DLR 还为调用创建并缓存表达式树,因此使用 DLR 几乎总是比反射更有效。
然而,DLR 的真正优势不仅仅是运行时绑定,它实际上允许您创建动态行为的对象。基本上,它允许您指定当您调用绑定到动态变量的实际运行时对象中不存在的方法或属性时会发生什么。这允许 CLR 用于动态语言,并提供与动态语言的轻松互操作,创建易于使用的解析器(可以将 DOM 表示为动态对象)或 ORM(可以将即席查询表示为对象等)。
有关 DLR 的更多详细信息,请参阅其。尤其值得一提的是和文件。
现在回答你的问题:
问题 1:不,你不能通过魔法与任何动态语言交互,必须有一些受支持的互操作(这可能由 DLR 促进)才能做到这一点(我不知道你所说的 Pascal dll 是什么意思。)
问题 2:ScriptObjectClass 使用 DLR 工具(通过扩展 DynamicObject)动态获取和设置 Count 属性,就好像它是 ScriptObjectClass 的实际属性一样(如果您好奇,请参阅具体是如何完成的。)