反射的基本结构

反射的基本结构,第1张

反射的基本结构:反射弧。一个典型的反射弧包括感受器、传入神经、中间神经元、传出神经和效应器五部分。其中,感受器为接受刺激的器官;传入神经为感觉神经元,是将感受器与中枢联系起来的通路;中间神经即神经中枢,包括脑和脊髓;传出神经为运动神经元,是将中枢与效应器联系起来的通路:效应器是产生效应的器官,如肌肉或腺体。

反射是一种自然现象,表现为受刺激物对刺激物的逆反应。反射的外延宽泛。物理学领域是指声波、光波或其他电磁波遇到别的媒质分界面而部分仍在原物质中传播的现象;生物学领域里反射是在中枢神经系统参与下,机体对内外环境刺激所作出的规律性反应。计算机领域中反射是提供封装程序集、模块和类型的对象;电子领域中就是在传输线上的回波。研究反射产生机制,,把握反射规律,有利于人类更好的利用反射进行各种相关工作。其应用领域是相当广泛的。

请注意看异常信息。未能从“当前”程序集获取“外部”程序集中拥有指定完整限定名的类型。

事实上,直接使用TypeGetType()会从当前程序集,也就是"test3"程序集中查找。

想要查找NHapiModelV23程序集中的类型,请在该程序集上使用GetType

Assembly asmNHapi=AssemblyLoadFrom();

Type outerType=asmNHapiGetType();

如果想尽量少的改动自己的代码也成,直接在你的var classes上进行linq查询就好。

Type[] classes=AssemblyLoadFrom()GetTypes();

Type tt=classesFirstOrDefault(t=>tFullName="NHapiModelV23GroupORM_001_"+properties[i]);

if(tt!=null)

    DoSomething();

最后提醒,请勿使用AssemblyLoad方法,因为该方法已被弃用,请使用LoadFrom和LoadFile来加载外部程序集。

此外,类型的完全限定名和短名并不影响类型的搜索。使用GetType时会从根命名空间开始一层一层查找的,如果各层命名空间下没有重名的类,你甚至没有使用完全限定名的必要。比如上面的代码里可以使用短名进行查找。

Type tt=classesFirstOrDefault(t=>tName="ORM_001_"+properties[i]);

刚看到上面的回答,这里我要肯定的告诉你,不管你是用文件方式还是项目引用方式,都不可能使用TypeGetType静态方法获取另一个程序集中的类型,必须在对方的程序集上进行查找!

如果你非要使用TypeGetType静态方法获取其他程序集中的类型,可以使用其的一种重载:

public static SystemType GetType(string typeName, SystemFunc<AssemblyName,Assembly> assemblyResolver, SystemFunc<Assembly,string,bool,Type> typeResolver)

该静态方法要求你提供自己的程序集名称解析器和类型名称解析器,非特殊情况不推荐使用。该方法是为了在多个程序集中同时查找多个类型而被微软提供的。

我先说下你想要的结果,你把AssemblyLoadFrom换成AssemblyLoadFile即可。

另外,你既然能够在你的应用中使用AssemblyLoadFrom这样的方法,那test1dll他们的路径就是已知的了,何必还要通过反射程序集内部方法来获取它的Location呢?

如果你是将test1dll注册到了全局环境中,那么我建议你不要使用LoadFrom和LoadFile,改用Load方法:将test1和test2通过版本号或者公钥(PublicKey)加以区别,然后用Load方法调用。调用参数类似于:“程序集名,Version=版本1,culture=区域信息1,PublicKeyToken=公钥1”,这是微软标准的做法。

反射则提供了封装程序集、模块和类型的对象。您可以使用反射动态地创建类型的实例,将类型绑定到现有对象,或从现有对象中获取类型。然后,可以调用类型的方法或访问其字段和属性。通过反射命名空间中的类以及 SystemType,您可以获取有关已加载的程序集和在其中定义的类型(如类、接口和值类型)的信息。您也可以使用反射在运行时创建类型实例,然后调用和访问这些实例。

这个类是可以通过

程序集

(exe,dll)名称,反射出这个程序集中的内容(引用,方法等等)

例如我有一个叫sampledll的文件,他的程序集名字就是sample,这个

类库

文件中有个类叫Test,可以用如下方法创建这个类的引用

AssemblyLoad("sample")CreateInstance("sampleTest");

sample是程序集的名字,sampleTest是程序集加类名

AssemblyLoad是加载这个程序集,CreateInstance是创建这个类的引用

当然System

Reflection

命名空间

中还有很多其他的用于反射的类你可以参见MSDN

Net Framework 中提供了反射机制,可以再加载程序运行时,动态获取和加载程序集,并且可以获取到程序集的信息

在程序集中,包含模块(Module),模块包含类型,类型包含成员,提供反射,我们可以查看到一个程序集的路径,命名空间,类。我们还可以对其进行 *** 作

可以对程序集的类进行实例化,掉用类中的方法等,就跟我们普通使用程序集一样

反射机制通常有下面一些用途

使用 Assembly 定义和加载程序集,加载在程序集清单中列出的模块,以及从此程序集中查找类型并创建该类型的实例。

使用 Module 发现以下信息:包含模块的程序集以及模块中的类等。 您还可以获取在模块上定义的所有全局方法或其他特定的非全局方法。

使用 ConstructorInfo 发现以下信息:构造函数的名称、参数、访问修饰符(如 public 或 private)和实现详细信息(如 abstract 或 virtual)等。 使用 Type 的 GetConstructors 或 GetConstructor 方法来调用特定的构造函数。

使用 MethodInfo 发现以下信息:方法的名称、返回类型、参数、访问修饰符(如 public 或 private)和实现详细信息(如 abstract 或 virtual)等。 使用 Type 的 GetMethods 或 GetMethod 方法来调用特定的方法。

使用 FieldInfo 发现以下信息:字段的名称、访问修饰符(如 public 或 private)和实现详细信息(如static)等;并获取或设置字段值。

使用 EventInfo 发现以下信息:事件的名称、事件处理程序数据类型、自定义特性、声明类型和反射类型等;并添加或移除事件处理程序。

使用 PropertyInfo 发现以下信息:属性的名称、数据类型、声明类型、反射类型和只读或可写状态等;并获取或设置属性值。

使用 ParameterInfo 发现以下信息:参数的名称、数据类型、参数是输入参数还是输出参数,以及参数在方法签名中的位置等。

当您在一个应用程序域的仅反射上下文中工作时,请使用 CustomAttributeData 来发现有关自定义特性的信息。 通过使用 CustomAttributeData,您不必创建特性的实例就可以检查它们。

微软官方解释:>

以上就是关于反射的基本结构全部的内容,包括:反射的基本结构、C#通过反射获取不同命名空间下的类(属性和方法)、C#动态加载程序集问题 高分求解等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

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

原文地址:https://54852.com/zz/9512997.html

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

发表评论

登录后才能评论

评论列表(0条)

    保存