C#动态对象dynamic实现方法和属性动态代码详解


本文摘自PHP中文网,作者黄舟,侵删。

下面小编就为大家带来一篇C#动态对象(dynamic)详解(实现方法和属性的动态)。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧

C#的动态对象的属性实现比较简单,如果要实现动态语言那种动态方法就比较困难,因为对于dynamic对象,扩展方法,匿名方法都是不能用直接的,这里还是利用对象和委托来模拟这种动态方法的实现,看起来有点javascript的对象味道:

1) 定义一个委托,参数个数可变,参数都是object类型:这里的委托多有个dynamic参数,代表调用这个委托的动态对象本身。

1

public delegate object MyDelegate(dynamic Sender, params object[] PMs);

2) 定义一个委托转载对象,因为dynamic对象不能直接用匿名方法,这里用对象去承载:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

public class DelegateObj

  {

    private MyDelegate _delegate;

 

    public MyDelegate CallMethod

    {

      get { return _delegate; }

    }

    private DelegateObj(MyDelegate D)

    {

      _delegate = D;

    }

    /// <summary>

    /// 构造委托对象,让它看起来有点javascript定义的味道.

    /// </summary>

    /// <param name="D"></param>

    /// <returns></returns>

    public static DelegateObj Function(MyDelegate D)

    {

      return new DelegateObj(D);

    }

  }

3) 定义一个动态对象:

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

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

76

77

78

79

80

81

82

public class DynObj : DynamicObject

  {

    //保存对象动态定义的属性值

    private Dictionary<string, object> _values;

    public DynObj()

    {

      _values = new Dictionary<string, object>();

    }

    /// <summary>

    /// 获取属性值

    /// </summary>

    /// <param name="propertyName"></param>

    /// <returns></returns>

    public object GetPropertyValue(string propertyName)

    {

      if (_values.ContainsKey(propertyName) == true)

      {

        return _values[propertyName];

      }

      return null;

    }

    /// <summary>

    /// 设置属性值

    /// </summary>

    /// <param name="propertyName"></param>

    /// <param name="value"></param>

    public void SetPropertyValue(string propertyName,object value)

    {

      if (_values.ContainsKey(propertyName) == true)

      {

        _values[propertyName] = value;

      }

      else

      {

        _values.Add(propertyName, value);

      }

    }

    /// <summary>

    /// 实现动态对象属性成员访问的方法,得到返回指定属性的值

    /// </summary>

    /// <param name="binder"></param>

    /// <param name="result"></param>

    /// <returns></returns>

    public override bool TryGetMember(GetMemberBinder binder, out object result)

    {

      result = GetPropertyValue(binder.Name);

      return result == null ? false : true;

    }

    /// <summary>

    /// 实现动态对象属性值设置的方法。

    /// </summary>

    /// <param name="binder"></param>

    /// <param name="value"></param>

    /// <returns></returns>

    public override bool TrySetMember(SetMemberBinder binder, object value)

    {

      SetPropertyValue(binder.Name, value);

      return true;

    }

    /// <summary>

    /// 动态对象动态方法调用时执行的实际代码

    /// </summary>

    /// <param name="binder"></param>

    /// <param name="args"></param>

    /// <param name="result"></param>

    /// <returns></returns>

    public override bool TryInvokeMember(InvokeMemberBinder binder, object[] args, out object result)

    {

      var theDelegateObj = GetPropertyValue(binder.Name) as DelegateObj;

      if (theDelegateObj == null || theDelegateObj.CallMethod == null)

      {

        result = null;

        return false;

      }

      result = theDelegateObj.CallMethod(this,args);

      return true;

    }

    public override bool TryInvoke(InvokeBinder binder, object[] args, out object result)

    {

      return base.TryInvoke(binder, args, out result);

    }

  }

应用测试代码:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

dynamic theObj = new DynObj();

      theObj.aaa = "this is a test";//动态属性

      //动态方法,这里不能没法定义参数,调用的时候可以是任意多参数,具体参数类型和含义就只能自己去小心处理了.

      theObj.show = DelegateObj.Function((s, pms) =>

      {

        if (pms != null && pms.Length > 0)

        {

          MessageBox.Show(pms[0].ToString() + ":" + s.aaa);

        }

        else

        {

          MessageBox.Show(s.aaa);

        }

        return null;

      }

      );

       

theObj.show("hello");

虽然看起来上面有点Js定义对象方法的味道,但由于C#是静态语言,提供的动态模拟机制还是有限的,看起来是动态,但所有的值存放和方法都需要自己写代码去处理.

上面代码在vs2010,windows 2008 server,框架4.0 上测试OK.

以上就是C#动态对象dynamic实现方法和属性动态代码详解的详细内容!

相关阅读 >>

C#正则函数匹配、替换、提取的用法代码分享

C#实现复制和深度复制的方法详解

C#中将字符串内容写入到txt文件中

详细介绍C#实现关闭子窗口而不释放子窗口对象的方法分享

使用c#操作windowad之的windows用户组

C#基于正则表达式去掉注释的方法示例

详解C# 控制台倒计时

C#实现base64处理的加密解密,编码解码的示例代码

详解C#把unicode编码转换为gb编码的示例代码

C#学习记录:编写高质量代码改善整理建议1-3

更多相关阅读请进入《C#》频道 >>




打赏

取消

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

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

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

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

评论

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