问题标签 [reflection]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
4 回答
4584 浏览

c# - C#中'is'反射的性能特点是什么?

表明'as' 转换比前缀转换快得多,但是'is' 反射呢?有多糟糕?您可以想象,在 Google 上搜索“is”并不是非常有效。

0 投票
2 回答
19829 浏览

c# - 加载同一程序集的不同版本

使用反射,我需要加载同一程序集的 2 个不同版本。我可以在同一进程中加载​​ 2 个不同 AppDomain 中的 2 个版本吗?

我需要从旧版本的应用程序到新版本进行一些数据迁移。请让我知道这是否可行,或者我应该使用 2 个单独的过程。

0 投票
2 回答
16455 浏览

c# - 如何在 C# 中在运行时加载程序集及其所有依赖项以进行反射?

我正在为自己编写一个实用程序,部分是作为学习 C# 反射的练习,部分是因为我实际上想要生成的工具供我自己使用。

我所追求的基本上是将应用程序指向一个程序集并选择一个给定的类,从中选择应该作为字段包含在导出的 HTML 表单中的属性。然后,该表单将在我的 ASP.NET MVC 应用程序中用作视图的开头。

由于我将 Subsonic 对象用于我想要使用的应用程序,这应该是合理的,我认为,通过想要包含诸如根据数据类型而不同的输出 HTML 之类的东西,反射是完成这项工作的方法。

然而,我正在寻找的东西似乎难以捉摸。我试图将通过 OpenFileDialog 选择的 DLL/EXE 作为起点并加载它:

这很好用,但由于 Subsonic 生成的对象实际上充满了在 Subsonic.dll 等中定义的对象类型,因此不会加载这些依赖对象。进入:

这也包含了我所期望的内容。但是,我想弄清楚的是如何加载这些程序集,以便我对对象的挖掘能够正常工作。我知道,如果这些程序集位于 GAC 或正在运行的可执行文件的目录中,我可以按它们的名称加载它们,但对于这个用例来说不太可能是这种情况,这是我的主要用例。

因此,它归结为如何加载给定程序集及其所有以文件名开头的任意程序集,并产生一个完全可反射浏览的类型、属性、方法等树。

我知道像 Reflector 这样的工具可以做到这一点,我只是找不到语法。

0 投票
8 回答
8808 浏览

c# - 使用反射调用 ASP.NET Web 服务

假设我有一个 ASMX Web 服务 MyService。该服务有一个方法,MyMethod。我可以在服务器端执行 MyMethod 如下:

我需要做类似的事情,直到运行时才知道服务和方法。

我假设反思是解决这个问题的方法。不幸的是,我很难让它发挥作用。当我执行此代码时:

它抛出这个错误:

无法从程序集“App_Web__ktsp_r0,版本=0.0.0.0,文化=中性,PublicKeyToken=null”加载类型“MyService”。

任何指导将不胜感激。

0 投票
2 回答
4001 浏览

.net - .NET 内省 VS 反射

.NET 中的自省和反射有什么区别

0 投票
2 回答
8315 浏览

c# - 从.NET 中的堆栈帧获取参数值?

我希望能够从 .NET 中的堆栈帧中获取所有参数值。有点像在 Visual Studio 调试器中查看调用堆栈中的值的方式。我的方法集中在使用StackFrame 类,然后反映在ParameterInfo数组上。我在反射和属性方面取得了成功,但这证明有点棘手。

有没有办法实现这一目标?

到目前为止的代码如下所示:

输出如下所示:

我希望它看起来更像这样:


只是为了一点背景,我的计划是在我抛出自己的异常时尝试使用它。我会更详细地查看您的建议,看看是否合适。

0 投票
2 回答
3649 浏览

c# - PropertyGrid、DefaultValueAttribute、动态对象和枚举

注意:我使用的是 .Net 1.1,尽管我并不完全反对使用更高版本的答案。

我在 PropertyGrid 中显示一些动态生成的对象。这些对象具有数字、文本和枚举属性。目前我在设置枚举的默认值时遇到问题,因此它们在列表中并不总是显示为粗体。枚举本身也是动态生成的,并且除了默认值之外似乎工作正常。

首先,我想展示在导致错误的情况下如何生成枚举。第一行使用自定义类来查询数据库。只需将此行替换为 DataAdapter 或使用数据库值填充 DataSet 的首选方法。我正在使用第 1 列中的字符串值来创建我的枚举。

现在了解如何创建类型。这主要基于此处提供的示例代码。本质上,将 pFeature 视为数据库行。我们遍历列,使用列名作为新的属性名,使用列值作为默认值;至少这是目标。

最后,我们使用该类型创建它的实例并加载默认值,以便稍后使用 PropertiesGrid 显示它。

但是,当我们尝试获取枚举的默认值时,这会导致错误。DefaultValueAttribute dva 未设置,因此当我们尝试使用它时会导致异常。

如果我们更改此代码段:

对此:

获取 DefaultValueAttribute dva 没有问题;但是,该字段随后在 PropertiesGrid 中以粗体显示,因为它与默认值不匹配。

当我将默认值设置为生成的枚举时,任何人都可以弄清楚为什么我无法获得 DefaultValueAttribute 吗?正如你可能猜到的,我对 Reflection 还是新手,所以这对我来说都是全新的。

谢谢。

更新:作为对 alabamasucks.blogspot 的回应,使用 ShouldSerialize 肯定会解决我的问题。我能够使用普通类创建方法;但是,我不确定如何为生成的类型执行此操作。据我所知,我需要使用 MethodBuilder 并生成 IL 来检查该字段是否等于默认值。听起来很简单。我想在 IL 代码中表示这一点:

我能够使用 ildasm.exe 从类似的代码中获取 IL 代码,但我有几个问题。如何在 IL 代码中使用 val 变量?在我的示例中,我使用了一个值为 0 的 int。

这肯定会变得很棘手,因为 IL 对每种类型都有不同的加载命令。目前,我使用整数、双精度、字符串和枚举,因此代码必须根据类型进行自适应。

有谁知道如何做到这一点?还是我走错了方向?

0 投票
8 回答
12604 浏览

c# - 从派生类自动调用 base.Dispose()

编辑 - 新问题

好的,让我们更笼统地重新表述这个问题。

使用反射,有没有办法在运行时动态调用您可能覆盖的基类方法。您不能在编译时使用“base”关键字,因为您无法确定它是否存在。在运行时,我想列出我的祖先方法并调用祖先方法。

我尝试使用 GetMethods() 等,但它们返回的只是指向该方法的最派生实现的“指针”。不是基类的实现。

背景

我们正在使用 C# 3.0 开发一个具有相对较大的类层次结构的系统。其中一些类,在层次结构中的任何位置,都具有需要释放的资源,它们实现了IDisposable接口。

问题

现在,为了方便代码的维护和重构,我想为实现 IDisposable 的类找到一种方法,如果任何祖先也实现 IDisposable ,则“自动”调用base.Dispose(bDisposing) 。这样,如果层次结构中较高的某个类开始实现或停止实现 IDisposable,它将自动得到处理。

问题有两个方面。

  • 首先,查找是否有任何祖先实现了 IDisposable。
  • 其次,有条件地调用 base.Dispose(bDisposing)。

第一部分,关于实现 IDisposable 的祖先的发现,我已经能够处理。

第二部分是棘手的部分。尽管我付出了所有努力,但我还是无法从派生类中调用 base.Dispose(bDisposing)。我所有的尝试都失败了。它们要么导致编译错误,要么调用错误的 Dispose() 方法,这是最衍生的方法,因此永远循环。

主要问题是,如果没有实现它的祖先之类的东西,您实际上不能在代码中直接引用 base.Dispose() (请注意,可能还没有实现 IDisposable 的祖先,但我希望派生代码准备好何时以及如果将来发生这样的事情)。这给我们留下了反射机制,但我没有找到合适的方法。我们的代码充满了先进的反射技术,我想我没有错过任何明显的东西。

我的解决方案

我最好的办法是在注释代码中使用一些条件代码。更改 IDisposable 层次结构会破坏构建(如果不存在 IDisposable 祖先)或引发异常(如果存在 IDisposable 祖先但未调用 base.Dispose)。

这是我发布的一些代码,向您展示我的 Dispose(bDisposing) 方法的外观。我将此代码放在整个层次结构中所有 Dispose() 方法的末尾。任何新类都是从也包含此代码的模板创建的。

所以,我问有没有办法自动/有条件地调用 base.Dispose() ?

更多背景

应用程序中还有另一种机制,其中所有对象都注册到一个主类。该类检查它们是否实现了 IDisposable。如果是这样,它们将由应用程序正确处理。这避免了使用类来处理自己调用 Dispose() 的代码。因此,将 IDisposable 添加到没有 IDisposable 祖先历史的类中仍然可以正常工作。

0 投票
11 回答
190004 浏览

c# - 通过反射获取命名空间中的所有类型

如何通过 C# 中的反射获取命名空间中的所有类?

0 投票
6 回答
23091 浏览

c# - 通过反射实现接口

如何通过 C# 中的反射获得接口的所有实现?