当前位置: 首页 > wzjs >正文

网站建设从零开始视频教程休闲食品网站建设规划书

网站建设从零开始视频教程,休闲食品网站建设规划书,免费网站建设视频,在哪里可以做百度推广反射(Reflection) 反射是C#中强大的机制,允许程序在运行时动态获取类型信息、操作对象或调用方法,而无需在编译时明确直到类型的定义。 动态类型操作 通过Type类获取类型信息(如typeof()或obj.GetType()),检查继承关系…

反射(Reflection)

反射是C#中强大的机制,允许程序在运行时动态获取类型信息、操作对象或调用方法,而无需在编译时明确直到类型的定义。

  1. 动态类型操作

    • 通过Type类获取类型信息(如typeof()obj.GetType()),检查继承关系(IsSubclassOf)、接口实现(IsAssignableFrom)等。

    • 动态创建实例:Activator.CreateInstance支持通过构造函数参数甚至私有构造方法实例化对象。

    • 调用方法和属性:通过MethodInfo.Invoke执行方法,PropertyInfo.SetValue设置属性值。

    • 处理泛型:例如通过MakeGenericType创建泛型类实例,MakeGenericMethod调用泛型方法。

  2. 程序集操作

    • 加载外部程序集:Assembly.LoadFromAssembly.LoadFile动态加载DLL。

    • 遍历程序集的类型和成员:例如获取所有公共方法或私有字段。

  3. 性能与限制

    • 反射虽灵活,但存在性能开销(因动态解析类型)和安全性风险(如访问私有成员破坏封装)。

    • 适用场景:序列化、依赖注入、测试框架等需要动态行为的场景

使用方法
  • 获取类型信息

    通过Type类获取对象的类型元数据

Type type = typeof(int);         // 通过类型名
Type type2 = myObj.GetType();   // 通过对象实例
  • 动态创建对象

       使用Activator.CreateInstance创建实例

Type type = typeof(MyClass);
object instance = Activator.CreateInstance(type);
  • 访问成员

        获取属性、方法、字段信息

PropertyInfo[] props = type.GetProperties();
MethodInfo method = type.GetMethod("MyMethod");
  •  动态调用方法

         通过反射调用方法

MethodInfo method = type.GetMethod("Add");
int result = (int)method.Invoke(instance, new object[] { 2, 3 });
汇总使用场景
  • 插件系统:动态加载程序集(DLL)并调用其功能。

  • 序列化/反序列化:通过反射便利对象的属性生成JSON/XML。

  • ORM框架:将数据库记录映射到对象属性。

  • 单元测试框架:自动发现并执行测试方法。

注意要点

反射操作通常比静态代码慢,需要慎重使用。

  • 缓存TypeMethodInfo对象。

  • 使用dynamic关键字(动态类型)。

  • 改用表达树(Expression Trees)或源代码生成器(Souree Generators)。

反射官方文档

属性和反射 - C# | Microsoft Learn

特性(Attributes)

特性是为代码元素(类、方法、属性等)添加元数据的标记,这些元数据可通过反射在运行时读取,用于控制程序行为或提供额外信息。

内置常用类型
  • [AttributeUsage]  约束自定义特性的应用目标(如类、方法)和是否允许多次应用。 

  • [Obsolete]  标记方法或类已过时。
     

    [Obsolete("Use NewMethod instead", error: true)]
    public void OldMethod() { }
  • [Serializable]  标记类可序列化。 

  • [DllImport] 用于调用非托管代码。

  •  [Conditional] 条件编译(如调试代码):
    [Conditional("DEBUG")]
    public void Log(string message) { }
自定义特性
  • 自定特性类
    继承Attribute类并添加元数据
    [AttributeUsage(AttributeTargets.Class | AttributeTargets.Method, AllowMultiple = true)]
    public class AuthorAttribute : Attribute
    {public string Name { get; }public AuthorAttribute(string name) => Name = name;
    }
  • 应用特性
    将特性标记到目标代码元素

    [Author("John")]
    [Author("Jane", Version = 2.0)] // 允许通过属性传递参数
    public class MyClass { }
  • 通过反射读取特性
    在运行时获取特性信息
    Type type = typeof(MyClass);
    var attributes = type.GetCustomAttributes(typeof(AuthorAttribute), false);
    foreach (AuthorAttribute attr in attributes)
    {Console.WriteLine($"作者: {attr.Name}");
    }
汇总使用场景
  • 验证逻辑:通过特性标记必填字段(类似[Required])。

  • Web路由:ASP.NET Core中[HttpGet][Route]等特性定义API端点。

  • 权限控制:自定义[Authorize]特性限制访问权限。

  • 文档生成:为Swagger等工具提供API描述信息([ApiExplorer])。

特性官方文档

属性和反射 - C# | Microsoft Learn

反射与特性的协同

两者结合可实现高度动态化的编程模式:

  1. 元数据驱动设计

    • 特性提供结构化元数据(如[Required]验证标记),反射在运行时读取并执行逻辑(如自动验证字段)。

    • 示例:ASP.NET MVC通过[HttpGet]等特性标记控制器方法,反射解析路由并调用对应方法。

  2. 动态代码生成与扩展

    • 反射可动态生成类型(如Emit技术),特性则为生成的代码添加配置信息。

    • 序列化库(如JSON.NET )利用特性控制序列化行为(如[JsonPropertyName]),反射遍历属性进行转换。

反射和特性优缺特点

技术优点缺点
反射动态性高、支持通用代码(如插件系统)性能低、破坏封装、代码可读性差
特性声明式编程、简化配置、增强元数据过度使用导致维护困难、兼容性依赖运行时版本

反射和特性使用方面

  • 自动注册服务:通过扫描程序集中标记了`[Service]`特性的类,实现依赖注入。
  • AOP(面向切面编程):通过特性标记需要拦截的方法,利用反射动态生成代理。
    // 自定义特性标记Excel列索引
    [AttributeUsage(AttributeTargets.Property)]
    public class ExcelColumnAttribute : Attribute {public int Index { get; }public ExcelColumnAttribute(int index) => Index = index;
    }public class Product {[ExcelColumn(0)] public string Name { get; set; }[ExcelColumn(1)] public decimal Price { get; set; }
    }// 反射读取特性并映射Excel数据
    public static List<Product> ParseExcel(string filePath) {var products = new List<Product>();var type = typeof(Product);foreach (var prop in type.GetProperties()) {var attr = prop.GetCustomAttribute<ExcelColumnAttribute>();if (attr != null) {// 根据attr.Index读取Excel列并赋值}}return products;
    }
    

反射和特性注意事项

  • 安全性:反射可能绕过访问修饰符(如访问私有成员),需谨慎使用。

  • 维护性:过度依赖反射会降低代码可读性,尽量通过接口或泛型替代。

  • 性能敏感场景:避免在频繁执行的代码路径中使用反射。

    http://www.dtcms.com/wzjs/611293.html

    相关文章:

  1. 小型企业网站模板下载有哪些网站可以用
  2. 大连网站建设方案维护容桂网站制作动态
  3. 网站制作企业对比河北省住房和城市建设厅网站
  4. 网站建设和网络推广服务公司购物网站模板 php
  5. 做软件的网站建设wix做的网站能扒下来
  6. 规划案例网站企业形象包装设计
  7. 国外网站 国内做镜像找人给公司做网站去哪找
  8. 网站 模板 下载石家庄建筑工程造价信息网
  9. pc网站开发语言08r2 搭建php网站
  10. 阿里云oss做网站备份泉州网站建设方案外包
  11. 企业网站百度指数多少算竞争大win10最强优化软件
  12. 怎么做网站免费优化北京seo推广优化
  13. 温州微网站公司给非吸公司建设网站
  14. php网站开发班国外做SEO网站
  15. 北京怀柔做网站管理运营的公司网页美工设计流程的正确排序
  16. 国家对于学校网站建设网站首页 选择入口 设计
  17. 网站外链是友情连接吗网站支付宝网上支付功能怎么做
  18. 火车票网站建设多少钱做网站 花园路国贸
  19. 如何做网站毕业设计怎么做网站推广世界杯
  20. 旌阳移动网站建设天津网站运营
  21. 初级网站建设做技术分享网站 盈利
  22. 在线网站生成器Wordpress导出成word
  23. 网站开发系统设计怎么写注册微信小程序流程
  24. 向自己做网站网站备案没有了
  25. 响应式网站设计的主页网站前台设计教程
  26. 网站中医建设wordpress多级索引
  27. 网站建设赚钱黄石本土做网站的公司
  28. 网站专业优化公司萧县做网站的公司
  29. 北京西站列车时刻表最新直通车推广怎么收费
  30. 网站代建设费用丹阳市房产信息网