win10 uwp 反射

标签: UWP 反射 C# .net win10
1365人阅读 评论(0) 收藏 举报
分类:

本文在h神的指导下完成。

反射是强大的好用的,我们可以添加新功能不修改之前的代码,通过使用反射得到。

本文下面和大家说如何做一个和WPF一样的反射功能,如何才能获的 UWP 程序集所有类。

先来说下反射。

.Net 最小单位是装配件,什么是装配件?其实就是 dll 或 exe 。.Net 程序包括 程序集 ,模块 , 类型 这几个。反射可以在程序运行得到这几个组成部分的相关信息。

反射可以获得Assembly,他可以获得正在运行的装配件信息,也可以动态的加载装配件,以及在装配件中查找类型信息,并创建该类型的实例。可以获得Type,他可以获得对象的类型信息,包括属性方法,可以调用属性方法。可以获得MethodInfo,他可以得到类方法的参数、返回值,可以调用方法。和MethodInfo差不多的,还有很多,都在System.Reflection可以看到。

反射是做什么?反射其实应用在对于类型差不多,但是需要对修改时不需要修改多处的代码使用。

  • 可以使用反射动态地创建类型的实例,将类型绑定到现有对象,或从现有对象中获取类型

  • 应用程序需要在运行时从某个特定的程序集中载入一个特定的类型,以便实现某个任务时可以用到反射

  • 反射主要应用与类库,这些类库需要知道一个类型的定义,以便提供更多的功能。

在我写的MVVM,就使用反射获得ViewModel,这样添加ViewModel 不需要修改写的代码。

反射可以添加类型不需要修改代码,这是很好的,但是反射性能比较差,在需要使用的时候才使用反射,不要每次都使用。

编译可以知道类型写错,反射不知道,可以得到错误的,一般使用反射需要小心,如果使用一些工具修改,那么反射得到的容易错误,好在C# 6有 name of 可以获得一个属性或方法的名称,这样使用他进行反射,得到的值才不容易出错。

uwp 程序集所有类

我们可以使用下面代码获得程序集所有的类

Application.Current.GetType().GetTypeInfo().Assembly
            foreach (var temp in applacationAssembly.DefinedTypes)
            {

            }

那么我们如何获得属于ViewModel的类,如果我们没有继承base,那我们有简单方法。

    public class ViewModelAssembly:Attribute
    {

    }
    [ViewModelAssembly]
    public class DstidModel : ViewModelBase

我们可以通过Attribute,查看是否有,如果有,就是ViewModel

            foreach (var temp in applacationAssembly.DefinedTypes)
            {
                if (temp.CustomAttributes.Any(t => t.AttributeType == typeof(ViewModelAssembly)))
                {

                }
            }

当然我们还修改下,因为我们不需要写那么多

            var applacationAssembly = Application.Current.GetType().GetTypeInfo().Assembly;
            foreach (var temp in applacationAssembly.DefinedTypes
                .Where(temp=>temp.CustomAttributes.Any(t => t.AttributeType == typeof(ViewModelAssembly))))
            {

            }

那么我们可以使用type得到ViewModel,参见http://lindexi.oschina.io/lindexi/post/win10-uwp-%E4%BB%8EType%E4%BD%BF%E7%94%A8%E6%9E%84%E9%80%A0/

WPF 反射获得所有类

            Assembly assembly = Assembly.GetExecutingAssembly();
            foreach (var temp in assembly.GetTypes())
            {


            }

获得类型

  1. typeof
    Type type = typeof(类型);
  1. System.Object.GetType

所有的类存在的方法,通过一个实例,可以获得实例的

    类型 t = new 类型();

    Type type=t.GetType();
  1. System.Type.GetType
    Type type=Type.GetType("cvte.类型",false,true);

注意参数0是类名,参数1表示若找不到对应类时是否抛出异常,参数1表示类名是否区分大小写

创建对象

创建对象的方法很多

   Assembly assembly = Assembly.Load("Assembly");

   Type type = assembly.GetType("Example");

   object obj =Activator.CreateInstance(type);

可以传入参数,参数可以传入多个

    object obj = Activator.CreateInstance(type,参数);

另一个方法

     object obj = type.Assembly.CreateInstance(type.FullName);

获得方法

获得类型方法

    MethodInfo[] listMethodInfo = type.GetMethods();

使用方法

     object obj =Activator.CreateInstance(type);
     MethodInfo methodInfo = type.GetMethod("方法");
     methodInfo.Invoke(obj,null);  //参数1类型为object[],代表方法的对应参数,输入值为null代表没有参数

获得属性

   object obj =Activator.CreateInstance(type);

   PropertyInfo propertyInfo = obj.GetProperty("Name");    //获取Name属性对象

   var name = propertyInfo.GetValue(obj,null);            //获取Name属性的值

   propertyInfo.SetValue(obj,"cvte",null);                //设置Name属性

获得Attribute

    object[] typeAttributes =type.GetCustomAttributes(false);   

判断一个类是另一个的子类

    class A
    {

    }

    class A1:A
    {

    }

    A1 a=new A1();
    a.GetType().IsSubclassOf(typeof(A)) 如果返回true,那么a就是继承 A

注意,虽然可以使用BaseType判断,但是如果继承多了,那么判断是否存在A,是不对的。

虽然说了很多,但很多都是大神讲的,于是

推荐大神讲的反射:http://www.cnblogs.com/wangshenhe/p/3256657.html

https://www.codeproject.com/Articles/55710/Reflection-in-NET

知识共享许可协议
本作品采用知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议进行许可。欢迎转载、使用、重新发布,但务必保留文章署名林德熙(包含链接:http://blog.csdn.net/lindexi_gd ),不得用于商业目的,基于本文修改后的作品务必以相同的许可发布。如有任何疑问,请与我联系

查看评论

讲讲我在Windows10(uwp)开发中遇到的一些坑

7月29日发布的Windows10正式版,当天安装好以后,在网络不太好的情况下,经过多次尝试终于装上了Visual Studio 2015和Windows 10 10240的SDK.这两周一直在开发U...
  • igweyou
  • igweyou
  • 2015-12-22 10:12:31
  • 4476

win10 uwp MVVM入门

MVVM 是一个强大的架构,基本从 WPF 开始,wr(我说的就是微软)就提倡使用 MVVM。它可以将界面和后台分离,让开发人员可以不关心界面是怎样,全心投入到后台代码编写中。 然后在编写完后台代码...
  • lindexi_gd
  • lindexi_gd
  • 2017-03-29 08:48:34
  • 3721

UWP开发之StreamSocket聊天室(二)

本节主要知识点:     1.StreamSocket     2.StreamSocketListener     3.Json序列化和反序列化(Json.Net 第三方库)     4.Data...
  • igweyou
  • igweyou
  • 2015-11-05 10:00:24
  • 2473

win10 uwp 反射

本文在h神的指导下完成。 反射是强大的好用的,我们可以添加新功能不修改之前的代码,通过使用反射得到。 本文下面和大家说如何做一个和WPF一样的反射功能,如何才能获的 UWP 程序集所有类。...
  • lindexi_gd
  • lindexi_gd
  • 2017-04-25 09:04:19
  • 1365

win10 uwp 按下等待按钮

我们经常需要一个按钮,在按下时,后台执行Task,这时不能再次按下按钮。
  • lindexi_gd
  • lindexi_gd
  • 2017-01-15 11:31:31
  • 1260

UWP从服务器下载文件

  • 2017年08月30日 11:45
  • 2KB
  • 下载

win10 uwp 入门

UWP是什么我在这里就不说,本文主要是介绍如何入门UWP,也是合并我写的博客。...
  • lindexi_gd
  • lindexi_gd
  • 2016-07-27 08:55:57
  • 4791

UWP: Win10 软件开发之学习笔记(2017.5.11更新)

现代操作系统应用开发以下是我个人的学习笔记,欢迎大家提出疑问,我们一起探讨。github1.XAML XAML只是特定格式的XML,它遵循所有XML的规则。XML的使用者就是将我们的代码变成windo...
  • linwh8
  • linwh8
  • 2017-03-22 20:02:04
  • 1754

win10 uwp 视差效果

本文翻译:http://jamescroft.co.uk/blog/uwp/playing-with-scrolling-parallax-effects-on-ui-elements-in-wind...
  • lindexi_gd
  • lindexi_gd
  • 2016-05-19 22:38:29
  • 2372

UWP_WebApi发送获取数据

  • 2017年08月30日 11:43
  • 6KB
  • 下载
    个人资料
    专栏达人 持之以恒
    等级:
    访问量: 69万+
    积分: 9941
    排名: 2188
    博客专栏
    文章分类
    最新评论