本文在h神的指导下完成。
反射是强大的好用的,我们可以添加新功能不修改之前的代码,通过使用反射得到。
本文下面和大家说如何做一个和WPF一样的反射功能,如何才能获的 UWP 程序集所有类。
<!--more-->
先来说下反射。
.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())
获得类型
- typeof
Type type = typeof(类型);
- System.Object.GetType
所有的类存在的方法,通过一个实例,可以获得实例的
类型 t = new 类型();
Type type=t.GetType();
- 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);
获得属性
object obj =Activator.CreateInstance(type);
PropertyInfo propertyInfo = obj.GetProperty("Name");
var name = propertyInfo.GetValue(obj,null);
propertyInfo.SetValue(obj,"cvte",null);
获得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
<!-- 我们可以获所有的ViewModel,在添加新的ViewModel,我们不需要做改动 -->

本作品采用知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议进行许可。欢迎转载、使用、重新发布,但务必保留文章署名林德熙(包含链接:http://blog.csdn.net/lindexi_gd ),不得用于商业目的,基于本文修改后的作品务必以相同的许可发布。如有任何疑问,请与我联系。
<script type="text/javascript">
$(function () {
$('pre.prettyprint code').each(function () {
var lines = $(this).text().split('\n').length;
var $numbering = $('<ul/>').addClass('pre-numbering').hide();
$(this).addClass('has-numbering').parent().append($numbering);
for (i = 1; i <= lines; i++) {
$numbering.append($('<li/>').text(i));
};
$numbering.fadeIn(1700);
});
});
</script>
分享到:
相关推荐
Win10 UWP 开发教程 课程 资源 80课时 课程地址:http://blog.csdn.net/shanguuncle/article/details/78111649
全选设置之后UWP即可访问localhost,可以走代理。
下面我们将深入探讨如何在Win10下通过UWP实现这些功能。 首先,我们需要了解UWP(Universal Windows Platform)是微软为Windows 10推出的一种跨设备的应用程序开发框架。它允许开发者编写一次代码,就能在各种...
总结来说,"win10 uwp 轻量级 MVVM 框架入门 2.1.5.3199 例子"提供了一个实际操作的平台,让开发者学习如何在UWP环境中利用MVVM模式进行开发。通过分析和实践这个框架,你将能够更好地理解MVVM的工作原理,以及如何...
在Windows 10 UWP应用开发中,常常需要创建一种用户友好的交互方式,即当用户右键点击某个元素时,能在一个特定的位置显示一个浮出菜单(MenuFlyout)。本篇文章将详细介绍如何使用C#实现这样的功能,使得MenuFlyout...
在本文中,我们将探讨如何利用Windows 10的UWP(通用Windows平台)应用程序与ASP.NET Core构建一个图床服务器的客户端。这是一个涉及到跨平台开发和云端图像存储管理的项目,旨在提供一种高效且灵活的方式来上传和...
win10 moblie uwp qq5.6.1150.1000主程序,不含依赖程序
win10 moblie uwp 越飞阅读1.4.68.0主程序,不含依赖程序
title: "win10 uwp 字符文本转语音声音文件方法"在 UWP 中,支持将传入的字符串文本内容转换为音频语音,可以将这个语音声音通过 MediaEl
但是LTSB/C也没了应用商店和UWP运行环境.,LTSC自动恢复win10应用商店,应用商店也是Win10的一大特色! Win10的应用商店也有一些优秀的应用可以代替臃肿的桌面程序. 使用该工具即可在 Windows10 LTSC(2019,1809) 上安装...
但是LTSB/C也没了应用商店和UWP运行环境.,LTSC自动恢复win10应用商店,应用商店也是Win10的一大特色! Win10的应用商店也有一些优秀的应用可以代替臃肿的桌面程序. 使用该工具即可在 Windows10 LTSC(2019,1809) 上...
首先打开 使用微软的账号或 github 账号登陆点击 add new 添加一个 UWP 程序,需要写出 app 的
如果需要反过来,把同步转异步,可以使用 同步方法转异步写你的代码使用Task.Wait 时需要小心死锁不会出现死锁的代码使用Task.Delay等待即使使用方法
此安装包为win10的uwp版应用软件Sound Blaster Connect,有需要的朋友可以去下载下来
【描述】提到的"一个uwp开发源码,可以移植到一切win10系统"意味着该项目遵循了UWP的跨平台特性,使得开发者能够在不同类型的Windows 10设备上部署和运行同一套代码。UWP是微软为了统一Windows生态而推出的新开发...
win10应用商店安装包,Microsoft.WindowsStore_11804.1001.913.0_neutral_~_8wekyb3d8bbwe,可用于不带应用商店的安装
微软推出的开源UWP社区工具包(Windows Community Toolkit)是一个关键的资源,它旨在简化和加速开发流程,使得开发者能够更高效地利用Win10 SDK进行编程。 UWP社区工具包是一个集合了各种辅助工具、组件和示例代码...
借助 Windows Explorer 上的这种现代 UWP,以更有效,更令人满意的方式管理文件 我们认为我们大多数人都可以同意 Windows 10 是迄今为止 Microsoft 操作系统的最佳版本,尽管它具有各种可感知的或多或少的主观缺点...
标题"BleScan_连接_Windows编程_ble_win10ble开发_win10ble_"涉及的核心技术是Windows 10上的蓝牙低功耗(Bluetooth Low Energy, BLE)开发,具体包括BLE设备的扫描、连接以及属性查询。这个项目是在64位Windows 10...
Windows10 引入了通用 Windows 平台 (UWP),这进一步推动了 Windows 运行时模型的发展,并将该平台引入到 Windows 10 统一核心版 中。作为核心版的一部分,UWP 现提供了一个可供在每个运行 Windows 10 的设备上使用...