2012-12-18 79 views
2

阅读this post和链接之后,我仍然有2个问题C#动态支持?

问题#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“?

+0

应该问2个问题,这个问题,2个问题...... –

+1

@LeeTaylor这两个问题都与同一主题有关。但是 - 污染标题为_两个有关C#动态支持的问题__肯定是错误的(SEO和未来问题搜索)。仅供参考。 :-) –

回答

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和动态关键字使得这个更简单。 DLR还为调用创建和缓存表达式树,因此使用DLR几乎总是比反射更有效。

但是,DLR的真正优势不仅仅是运行时绑定,它实际上允许您创建动态表现的对象。基本上它可以让你指定当你调用绑定到动态变量的实际运行时对象中不存在的方法或属性时发生的情况。这允许CLR用于动态语言并为动态语言提供简单的交互器,创建易于使用的可将DOM表示为动态对象的解析器或可将临时查询表示为对象等的ORM。

有关DLR的更多详细信息可在其codeplex project documentation page中找到。特别值得的是overviewSites, Binders, and Dynamic Object Interop Spec文件。

我们您的问题:

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

问题2:ScriptObjectClass使用DLR工具(通过扩展DynamicObject)来动态获取和设置Count属性,就好像它是ScriptObjectClass的实际属性一样(如果你是好奇看Sites, Binders, and Dynamic Object Interop Spec究竟是如何完成的。)

+0

'd.Value = 1;'在运行时会失败....只对expandoObject有效。 –

+0

** 1)**关于你的第一个答案 - 你是什么意思:“由dlr支持”?该课程是否必须在CLR下运行? .... ** 2)** DynamicObject是一个c#类。 ScriptObject(它不是用C#编写的)怎样才能继承DynamicObject?还是他们有自己的名字? –

+0

我会用2来回答1:ScriptObjectClass * IS *一个托管类,即在CLR上运行的.Net类(与写入的语言无关),因此它可以从DynamicObject继承。 ScriptObjectClass是用于与ScriptObj接口的CLR接口类(不管是什么),并使用DLR来简化接口,例如,允许ScriptObj.Count + = 1 –