千家信息网

C#中动态语言扩展的示例分析

发表于:2024-11-24 作者:千家信息网编辑
千家信息网最后更新 2024年11月24日,这篇文章给大家分享的是有关C#中动态语言扩展的示例分析 的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。(一)DLRC#4的动态功能是Dynamic Language Run
千家信息网最后更新 2024年11月24日C#中动态语言扩展的示例分析

这篇文章给大家分享的是有关C#中动态语言扩展的示例分析 的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。

(一)DLR

C#4的动态功能是Dynamic Language Runtime(动态语言运行时,DLR)的一部分。DLR是添加到CLR的一系列服务。

(二)dynamic类型

dynamic类型允许编写忽略编译期间的类型检查的代码。编译器假定,给dynamic类型的对象定义的任何操作都是有效的,在运行之前编译器不会检测是否存在错误。

例子:

dynamic person = "人";string firstName = person.FirstName;

这两行代码能够通过编译器编译,但是点击运行后会报错:

需要注意的是,dynamic类型虽然很有用,但是它是有代价的。

(三)包含DLR ScriptRuntime

给应用程序添加脚本编辑功能,并给脚本传入数值和从脚本传出数值,是应用程序可以利用脚本完成工作。

(四)DynamicObject和ExpandoObject

从DynamicObject中派生或者使用ExpandoObject可以创建自己的动态对象。

使用DynamicObject派生创建动态对象,需要重写3个方法TrySetMembe()、TryGetMember()和TryInvokeMember()。

使用ExpandoObject与DynamicObject进行派生的区别在于不用重写方法。

例子:

class Program{    static void Main(string[] args)    {        Func getFullName = (f, l) => { return f + " " + l; };        dynamic byexobj = new ExpandoObject();        byexobj.FirstName = "李";        byexobj.LastName = "四";        byexobj.GetFullName = getFullName;        Console.WriteLine(byexobj.GetType());        Console.WriteLine(byexobj.GetFullName(byexobj.FirstName, byexobj.LastName));        Console.WriteLine("=====================");        dynamic dyobj = new MyDynamicObject();        dyobj.FirstName = "张";        dyobj.LastName = "三";        dyobj.GetFullName = getFullName;        Console.WriteLine(dyobj.GetType());        Console.WriteLine(dyobj.GetFullName(dyobj.FirstName, dyobj.LastName));        Console.ReadKey();    }}public class MyDynamicObject : DynamicObject{    Dictionary dynamicData = new Dictionary();    public override bool TrySetMember(SetMemberBinder binder, object value)    {        dynamicData[binder.Name] = value;        return true;    }    public override bool TryGetMember(GetMemberBinder binder, out object result)    {        bool success = false;        result = null;        if (dynamicData.ContainsKey(binder.Name))        {            result = dynamicData[binder.Name];            success = true;        }        else        {            result = "未找到该属性的值";            success = false;        }        return success;    }    public override bool TryInvokeMember(InvokeMemberBinder binder, object[] args, out object result)    {        dynamic method = dynamicData[binder.Name];        result = method((string)args[0],(string)args[1]);        return result != null;    }}

运行以上代码,结果如下:

感谢各位的阅读!关于"C#中动态语言扩展的示例分析 "这篇文章就分享到这里了,希望以上内容可以对大家有一定的帮助,让大家可以学到更多知识,如果觉得文章不错,可以把它分享出去让更多的人看到吧!

0