问题标签 [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.
c# - 测试对象是否是 C# 中的字典
有没有办法测试一个对象是否是字典?
在一种方法中,我试图从列表框中的选定项目中获取值。在某些情况下,列表框可能绑定到字典,但这在编译时是未知的。
我想做类似的事情:
有没有办法在运行时使用反射动态地做到这一点?我知道可以将反射与泛型类型一起使用并确定键/值参数,但我不确定在检索到这些值之后是否有办法完成其余的工作。
.net - 修改现有的 .NET 程序集
有没有办法修改现有的 .NET 程序集而不求助于 3rd 方工具?我知道PostSharp使这成为可能,但我发现 PostSharp 的开发人员基本上必须重写整个System.Reflection
命名空间的功能才能使现有程序集可修改,这非常浪费。
System.Reflection.Emit
只允许创建新的动态程序集。但是,这里使用的所有构建器类都继承自基本反射类(例如TypeBuilder
,继承自System.Type
)。不幸的是,似乎没有办法将现有的、动态加载的类型强制到类型构建器中。至少,没有官方支持的方式。
那么不支持怎么办?有谁知道允许将现有程序集或类型加载到此类构建器类中的后门?
请注意,我不是在寻找修改当前程序集的方法(这甚至可能是一个不合理的请求),而只是为了修改从光盘加载的现有程序集。我担心没有这样的事情,但我还是想问一下。
在最坏的情况下,人们不得不求助于ildasm.exe
反汇编代码然后ilasm.exe
重新组装,但是.NET 中没有包含工具链(阅读:IL 阅读器)来处理 IL 数据(或者是否存在?)。
/编辑:
我没有具体的用例。我只是对通用解决方案感兴趣,因为修补现有程序集是一项非常常见的任务。以混淆器、分析器或 AOP 库为例(是的,后者可以以不同的方式实现)。正如我所说,被迫在System.Reflection
.
@楔:
你是对的。但是,这里没有特定的用例。我已经修改了原始问题以反映这一点。另一个问题引发了我的兴趣,提问者想知道如何在每个方法的末尾注入指令pop
,ret
以防止 Lutz Roeder 的 Reflector 重新设计(VB 或 C#)源代码。
现在,这个场景可以通过许多工具来实现,例如上面提到的 PostSharp 和用于 Reflector 的Reflexil插件,而后者又使用Cecil库。
总而言之,我只是对 .NET 框架不满意。
@乔尔:
是的,我知道这个限制。无论如何,感谢您指出它,因为它很重要。
@马克思达德:
这似乎是唯一可行的方法。但是,这意味着您仍然必须使用构建器类重新创建完整的程序集,对吗?即,您必须手动遍历整个组件。
嗯,我会调查的。
.net - 使用 .Net,我如何确定一个类型是否为 Numeric ValueType?
但这里有一个例子:
编辑:我只知道类型,而不是值作为字符串。
好的,很遗憾我必须循环浏览 TypeCode。
但这是一个很好的方法:
java - Java equals():反映还是不反映
这个问题与为具有大量字段的对象覆盖 equals() 方法特别相关。首先,让我说这个大对象不能在不违反 OO 原则的情况下分解成多个组件,所以告诉我“没有一个类应该有超过 x 个字段”是没有帮助的。
继续前进,当我忘记检查其中一个字段是否相等时,问题就解决了。因此,我的 equals 方法不正确。然后我想使用反射:
这篇文章的目的不一定是重构代码(这甚至不是我正在使用的代码),而是获取关于这是否是一个好主意的输入。
优点:
- 如果添加了新字段,则会自动包含该字段
- 该方法比 30 个 if 语句简洁得多
缺点:
- 如果添加了一个新字段,它会自动包含在内,有时这是不可取的
- 性能:这必须更慢,我觉得没有必要打破分析器
- 在比较中将某些要忽略的字段列入白名单有点难看
有什么想法吗?
java - 是否可以定义一个 Java 类加载器,将完全不同的类返回给请求的类?
我试过这个,但调用时得到一个 ClassNotFoundException :
c# - 如何获取类型成员的源文件名和行号?
考虑到调试数据文件可用 (PDB) 并使用System.Reflection或其他类似框架,例如Mono.Cecil),如何以编程方式检索源文件名和类型或类型成员所在的行号宣布。
例如,假设您已将此文件编译为程序集:
C:\MyProject\Foo.cs
如何执行以下操作:
sourceFileName 将包含“C:\MyProject\Foo.cs”并且 sourceLineNumber 等于 3。
更新:System.Diagnostics.StackFrame
确实能够获得该信息,但仅限于当前执行的调用堆栈范围内。这意味着必须首先调用该方法。我想获得相同的信息,但不调用类型成员。
c# - 您如何确定给定的类型(System.Type)是否继承自特定的基类(在 .Net 中)?
这可能是一个简单的答案,我只是遗漏了一些东西,但是这里......如果我有一个类型,(即,一个实际的 System.Type......不是一个实例)我如何判断是否它继承自另一个特定的基本类型?
.net - 从其名称实例化泛型的最佳方法是什么?
假设我只有一个泛型的类名作为“MyCustomGenericCollection(of MyCustomObjectClass)”形式的字符串,并且不知道它来自哪个程序集,那么创建该对象实例的最简单方法是什么?
如果有帮助,我知道该类实现了 IMyCustomInterface 并且来自加载到当前 AppDomain 的程序集。
Markus Olsson 在这里给出了一个很好的例子,但我不知道如何将它应用于泛型。
asp.net - 无法反映方法“XYZ”
我们使用了第三方 Web 服务并尝试从 ASP.NET Web 应用程序调用它。但是,当我实例化 Web 服务时,会引发以下 System.InvalidOperationException 异常:
无法反映方法“ABC.XYZ”。System.InvalidOperationException:无法反映方法“ABC.XYZ”。---> System.InvalidOperationException:命名空间“ http://mysoftware.com/ns ”中的 XML 元素“MyDoc ”引用了一个方法和一个类型。使用 WebMethodAttribute 更改方法的消息名称或使用 XmlRootAttribute 更改类型的根元素。
据我所知,Web 服务中的方法和类型之间似乎存在一些歧义。任何人都可以澄清这个异常的可能原因吗?我能做些什么来纠正这个问题,或者我应该去网络服务所有者纠正吗?
编辑:Visual Studio 2008 已经创建了代理类。不幸的是,我无法提供 wsdl 的链接,因为它是本地安装的第三方应用程序的 Web 服务。
.net - 使用反射获取构造子类类型的集合
我想创建一个实现 IEnumerable<T> 的类,但使用反射生成 T 并通过 IEnumerable<T> 返回它们,其中 T' 是 T 的完全构造的子类,其中一些属性隐藏,其他属性只读。
好吧,那可能不是很清楚。让我通过代码来解释这一点 - 我想要一个 CollectionView<T> 类,如下所示: -
(当在 dataGridView1 中显示时,显示列 B 和 C 和 C 具有一个只读的底层存储)
这是可能的/可取的还是我完全失去了理智/这个问题是否表明我作为程序员的严重不足?
我想这样做,以便我可以操作要传递到 DataGridView 的集合,而不必直接操作 DataGridView 来隐藏列/使列只读。所以不要'哦,只使用 dataGridView1.Columns.Remove(blah) / dataGridView1.Columns[blah].ReadOnly = true' 请回答!
帮助!