C#高级编程 第十二章 动态语言扩展


本文摘自PHP中文网,作者大家讲道理,侵删。

(一)DLR

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

(二)dynamic类型

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

例子:


1

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

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

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

(三)包含DLR ScriptRuntime

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

(四)DynamicObject和ExpandoObject

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

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

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

例子:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

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#高级编程 第十二章 动态语言扩展

更多相关阅读请进入《动态语言扩展》频道 >>




打赏

取消

感谢您的支持,我会继续努力的!

扫码支持
扫码打赏,您说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦

分享从这里开始,精彩与您同在

评论

管理员已关闭评论功能...