温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

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

发布时间:2021-09-09 16:48:57 来源:亿速云 阅读:114 作者:小新 栏目:编程语言

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

(一)DLR

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

(二)dynamic类型

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

例子:

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

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

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

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

(三)包含DLR ScriptRuntime

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

(四)DynamicObject和ExpandoObject

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

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

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

例子:

class Program
{
    static void Main(string[] args)
    {
        Func<string, string, string> 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<string, object> dynamicData = new Dictionary<string, object>();
    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#中动态语言扩展的示例分析

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

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI