本文在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) 上...
首先打开 使用微软的账号或 github 账号登陆点击 add new 添加一个 UWP 程序,需要写出 app 的
但是LTSB/C也没了应用商店和UWP运行环境.,LTSC自动恢复win10应用商店,应用商店也是Win10的一大特色! Win10的应用商店也有一些优秀的应用可以代替臃肿的桌面程序. 使用该工具即可在 Windows10 LTSC(2019,1809) 上安装...
如果需要反过来,把同步转异步,可以使用 同步方法转异步写你的代码使用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 操作系统的最佳版本,尽管它具有各种可感知的或多或少的主观缺点...
Windows10 引入了通用 Windows 平台 (UWP),这进一步推动了 Windows 运行时模型的发展,并将该平台引入到 Windows 10 统一核心版 中。作为核心版的一部分,UWP 现提供了一个可供在每个运行 Windows 10 的设备上使用...
此安装包为win10的uwp版应用软件Realtek Audio Control,有需要的朋友可以去下载下来