zoukankan      html  css  js  c++  java
  • 浅谈Dynamic 关键字系列之二:调用属性,方法,字段

    新建类Product:

    class Product
    {
        public string name;
        public int Id { get; set; }
    
        public void ShowProduct()
        {
            Console.WriteLine("Id={0} ,Name={1}", Id, name);
        }
    }

    Main方法代码如下:

    static void Main(string[] args)
    {
        //dynamic对象
        dynamic dynProduct = new Product();
    
        //设置name字段
        dynProduct.name = "n1";
        
        //设置Id属性
        dynProduct.Id = 1;
        dynProduct.Id = dynProduct.Id + 3;
        
        //调用ShowProduct方法
        dynProduct.ShowProduct();
    
        Console.ReadLine();
    }

    输出如下:

    clip_image002

    修改dynProduct.Id=”1”,此时"1”是字符串

    运行:

    image

    因为product的Id属性是int型

    修改dynProduct.ShowProducT(); 运行:

    image

    因为product 包含ShowProduct 的方法,但是并没有包含ShowProducT的方法,

    所以dynamic不支持大小写不同。根本原因是因为C#也不支持。

    修改Product中name的修饰符:将Public改为private:

    private string name;

    再次运行代码:

    image

    因为name是private,外部无法访问。。。

    但是反射好像是可以的啊?

    那么尝试下反射吧:

    Type productType = typeof(Product);
    Product p = new Product();
    
    FieldInfo fi = productType.GetField("name",
        BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.DeclaredOnly);
    fi.SetValue(p, "通过反射设置的值");

    运行,结果如下:

    image

    因为在某些安全限制条件下,是不运行读取和设置私有字段的,例如在silverlight中。所以微软大概出于对这一点的考虑,所以dynamic不支持私有字段的读取和设置吧,以上纯属个人猜想。

  • 相关阅读:
    视频检索扫盲 (一)
    PPT计时器
    遇到的错误及解决方案
    SimpleDBM 组件分析 (二)
    Winform 窗口圆角实现
    SimpleDBM 组件分析 (一)
    转载:DataGridView 导出到 Excel中
    Winform隐藏标题栏后移动窗口
    Paper Reading:The Google File System(一)
    PDF C#操作
  • 原文地址:https://www.cnblogs.com/LoveJenny/p/2097694.html
Copyright © 2011-2022 走看看