C#语言反射出问题,如果是没有new的时候的类,就可以成功,无法获取已经new的类名,帮我看看

C#语言反射出问题,如果是没有new的时候的类,就可以成功,无法获取已经new的类名,帮我看看,第1张

XX是类型、结构都行,Type是描述类型的类型

dd是XX类型的实例

实例是通过类型为模板创建出来的

所以,如果想获取XX 里面的所有公开的方法

可以先获取XX的类型的实例

从实例获取: Type type = ddGetType();

直接获取   : Type type = typeof(XX);

获取XX所有公开的方法: MethodInfo[] methods = typeGetMethods();

从类型描述实例创建实例(如果有公开的无参构造函数的话):object obj = ActivatorCreateInstace(type);

我们继续C#基础知识的学习 这篇文章主要要讲的是我们C#程序员迈向高级C#程序员的关键性的一步

有的朋友会说事实不是这样的 我不用反射就不能开发吗?当然可以 但是用与不用肯定是不一样的 任何复杂抽象的分层架构或者说是复杂的设计模式均是建立在这些基础之上的 比如我们要进行模块化 组件化开发 要严格的消除模块之间的耦合 要进行动态接口调用 这样的强大而灵活的系统开发 必须要用反射才行 任何技术都有它存在的价值和意义 只要我们把它用在合适的位置就能发挥出惊人的力量 能尽可能的减少我们编写的代码 更能是我们的代码便的清晰简洁

下面我们就来学习C#中的反射的概念以及怎么使用它 用它能为我们提供什么样的好处 更重要的是能否将我们的技术台阶提升一个高度

什么叫反射

要想快速的学习一种技术 首先我们要明白这个技术是干什么的 我们需要有个大局观 需要有个总体的认识了解 才能发挥出每个人本能的理解能力 而不是拉着你来理解我的想法 只有这样我们才能学的更快 不知不觉我们就能形成自己一套独立的思考能力 [王清培版权所有 转载请给出署名]

自然解释 射是一种自然现象 表现为受 物对 物的逆反应 这是反射的字面解释 我们看一下计算机编程中的反射

编程解释 通过 System Reflection 命名空间中的类以及 System Type 您可以获取有关已加载的程序集和在其中定义的类型(如类 接口和值类型)的信息 您也可以使用反射在运行时创建类型实例 以及调用和访问这些实例 这是来自微软官方的MSDN定义

通过这两者的比较 我想对于我们初学者来说 反射就是通过某种事物去反射另一种事物 我们小时候进行喜欢用镜子对着墙上照 会出现一个个小光圈 这就是很典型的反射例子 我们把它理解成计算机里的反射就是我用某中对象去反射我无法直接获取到的东西

这幅图我想还是比较形象的 至少在我们脑子里已经有了这么一个概念 反射 反射就是通过某种中间设备获取到另一端的东西

C#里面反射跟上面的概念是一样的 原理也是一样的 下面我们就用代码示例来进行讲解 我想通过本篇文章的学习 您一定可以很透彻的理解反射的概念

C#反射示例

在我的解决方案里面有两个项目 Reflection是控制台应用程序 TestDll是我们所要反射的项目 在这个项目里面我定义了一个Math类 也就是我们要反射的对象

为了演示方便 我们需要设置一下TestDll项目的生成输出路径 也就是我们主程序的启动目录

这样设置之后 我们项目的输出文件就会在我们应用程序的启动目录中 反射也就会方便一点 为了让初学者能少走弯路 我就费点事加上了

按F 编译一下 会输出TestDll dll文件到Reflection的Debug目录中 我们切换到Reflection中的Main方法中开始进行反射 *** 作

view sourceprint

using System;

using System Collections Generic;

using System Text;

using System Reflection;

using System Diagnostics;

namespace Reflection

{

class Program

{

static void Main(string[] args)

{

Assembly dll = Assembly LoadFile(Environment CurrentDirectory + \\TestDll dll )

Type math = dll GetType( TestDll Math true)

MethodInfo method = math GetMethod( add )

int count = (int)method Invoke(null new object[] { })

Console WriteLine( Invoke Method: + count ToString())

Console ReadLine()

}

}

}

我在Math类中定义了一个静态方法add 在这里我们就可以通过反射拿到Math对象进行动态调用了

Assembly对象就好比我们日常生活中的镜子 我用这个镜子去照一下外部的DLL文件 那个文件里面的所有数据就可以反射给我了 我在通过托管对象进行一系列的获取调用了 具体的对象读者可以上网搜搜 大牛们讲解的比我详细 我只是做个入门介绍而已

lishixinzhi/Article/program/net/201311/13536

 class Test

        {

            public static string StaticPer = "StaticPer";

            public readonly string ReadOnlyPer = "ReadOnlyPer";

            public const string ConstPer = "ConstPer";

            public string GetPer { get { return "GetPer"; } }

            private string _SetPer;

            public string SetPer { set { _SetPer = value; } }

            public string GetSetPer { get; set; }

            public void Ok()

            {

            }

        }

        

        

        

        var obj = new Test();

            var type = objGetType();

            var p = typeGetProperties(BindingFlagsInstance | BindingFlagsPublic);

            foreach (var item in p)

            {

                ConsoleWriteLine("Name: {0}", itemName);

            }

            foreach (FieldInfo field in typeGetFields())

            {

                ConsoleWriteLine("Field: {0}, Value:{1}", fieldName, fieldGetValue(obj));

            }

以上就是关于C#语言反射出问题,如果是没有new的时候的类,就可以成功,无法获取已经new的类名,帮我看看全部的内容,包括:C#语言反射出问题,如果是没有new的时候的类,就可以成功,无法获取已经new的类名,帮我看看、.NET简谈反射(动态调用)、c#中的静态变量,怎么通过反射的方式获取指定变量名称的值呢比如说一个const类型的常量:con等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/10158030.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-05
下一篇 2023-05-05

发表评论

登录后才能评论

评论列表(0条)

保存