Questions tagged «reflection»

反射是程序在运行时观察和/或修改其结构和/或行为的能力。反射取决于支持的编程语言-请在使用此标记时标记正在使用的编程语言。


1
避免歧义匹配异常
我通过反射在类型上调用静态方法Parse,因为我在编译时不知道对象的类型(但是我知道,它有一个Parse方法,需要一个字符串)。 但是,我得到了一个模棱两可的match异常,大概是因为有很多重载的Parse方法,每个方法都带有一个对象(字符串,int,double等)。 如何在我的方法调用中更加具体,以确保到达正确的方法(Parse(string s))并且不引发异常。 我的代码如下所示: Type returnType = p.PropertyType; object value = returnType.GetMethod("Parse").Invoke(null, new string[] { "1" });

8
我可以使用反射更改C#中的私有只读字段吗?
我想知道,由于反射可以完成很多事情,构造函数完成执行后是否可以更改私有只读字段? (注意:只是好奇心) public class Foo { private readonly int bar; public Foo(int num) { bar = num; } public int GetBar() { return bar; } } Foo foo = new Foo(123); Console.WriteLine(foo.GetBar()); // display 123 // reflection code here... Console.WriteLine(foo.GetBar()); // display 456
115 c#  reflection  field  readonly 

18
确定对象是否为原始类型
我有一个Object[]数组,我试图找到那些是原始的。我尝试使用Class.isPrimitive(),但似乎我做错了什么: int i = 3; Object o = i; System.out.println(o.getClass().getName() + ", " + o.getClass().isPrimitive()); 版画java.lang.Integer, false。 有正确的方法或替代方法吗?
114 java  reflection 

6
Swift支持反射吗?
Swift支持反射吗?例如,是否有valueForKeyPath:和setValue:forKeyPath:Swift对象类似的东西? 实际上,它甚至还具有动态类型系统,例如obj.class在Objective-C中吗?
113 ios  reflection  swift 

8
如何使用所有引用递归将程序集加载到AppDomain?
我想加载到AppDomain具有复杂引用树的新程序集(MyDll.dll-> Microsoft.Office.Interop.Excel.dll-> Microsoft.Vbe.Interop.dll-> Office.dll-> stdole.dll) 据我了解,将程序集加载到时AppDomain,其引用不会自动加载,而我必须手动加载它们。因此,当我这样做时: string dir = @"SomePath"; // different from AppDomain.CurrentDomain.BaseDirectory string path = System.IO.Path.Combine(dir, "MyDll.dll"); AppDomainSetup setup = AppDomain.CurrentDomain.SetupInformation; setup.ApplicationBase = dir; AppDomain domain = AppDomain.CreateDomain("SomeAppDomain", null, setup); domain.Load(AssemblyName.GetAssemblyName(path)); 并得到FileNotFoundException: 无法加载文件或程序集'MyDll,版本= 1.0.0.0,文化=中性,PublicKeyToken =空'或其依赖项之一。该系统找不到指定的文件。 我认为关键部分是其依赖项之一。 好吧,我之前要做 domain.Load(AssemblyName.GetAssemblyName(path)); foreach (AssemblyName refAsmName in Assembly.ReflectionOnlyLoadFrom(path).GetReferencedAssemblies()) { domain.Load(refAsmName); } 但是FileNotFoundException再次出现在另一个(引用的)程序集上。 如何递归加载所有引用? …

3
查找定义了类的PHP文件(在运行时)
PHP中是否有任何反射/自省/魔术,可以让您找到定义了特定类(或函数)的PHP文件? 换句话说,我有一个PHP类或实例化对象的名称。我想将此传递给某个东西(函数,Reflection类等),该东西将返回定义该类的文件系统路径。 /path/to/class/definition.php 我意识到我可以使用(get_included_files())获取到目前为止已包含的所有文件的列表,然后手动解析它们,但是一次尝试就需要大量文件系统访问。 我还意识到我可以在__autoload机制中编写一些其他代码,以将该信息缓存到某个地方。但是,在我考虑到的情况下,修改现有的__autoload是不可行的。 听到可以做到这一点的扩展会很有趣,但是我最终希望可以在“常规”安装中运行的扩展。
111 php  reflection  class 

3
用反射调用静态方法
我在命名空间中有几个静态类,mySolution.Macros例如 static class Indent{ public static void Run(){ // implementation } // other helper methods } 所以我的问题是,在反射的帮助下如何调用这些方法? 如果方法不是静态的,那么我可以做些类似的事情: var macroClasses = Assembly.GetExecutingAssembly().GetTypes().Where( x => x.Namespace.ToUpper().Contains("MACRO") ); foreach (var tempClass in macroClasses) { var curInsance = Activator.CreateInstance(tempClass); // I know have an instance of a macro and will be able to …
111 c#  reflection  dynamic 


8
如何使用反射获取静态属性
因此,这似乎很基本,但我无法正常工作。我有一个对象,并且正在使用反射来获取它的公共属性。这些属性之一是静态的,我没有运气。 Public Function GetProp(ByRef obj As Object, ByVal propName as String) as PropertyInfo Return obj.GetType.GetProperty(propName) End Function 上面的代码对于公共实例属性运行良好,到目前为止,这只是我所需要的。可以使用BindingFlags来请求其他类型的属性(私有,静态),但是似乎找不到正确的组合。 Public Function GetProp(ByRef obj As Object, ByVal propName as String) as PropertyInfo Return obj.GetType.GetProperty(propName, Reflection.BindingFlags.Static Or Reflection.BindingFlags.Instance Or Reflection.BindingFlags.Public) End Function 但仍然,请求任何静态成员均不返回任何内容。.NET反射器可以很好地看到静态属性,因此很明显我在这里缺少一些东西。
109 .net  reflection  static 

8
如何在设计时可靠地确定使用var声明的变量的类型?
我正在为emacs中的C#完成(智能)功能。 这个想法是,如果用户键入一个片段,然后通过特定的按键组合要求完成,则完成设施将使用.NET反射来确定可能的完成。 这样做需要知道完成的事物的类型。如果是字符串,则存在一组已知的可能方法和属性。如果是Int32,则具有单独的集合,依此类推。 使用语义,emacs中提供了一个代码lexer / parser程序包,我可以找到变量声明及其类型。鉴于此,很容易使用反射来获取类型上的方法和属性,然后向用户显示选项列表。(好吧,在 emacs中执行操作不是很简单,但是使用在 emacs 中运行powershell进程的功能会变得容易得多。我编写了一个自定义.NET程序集进行反射,将其加载到powershell中,然后在运行时在elisp中运行emacs可以通过comint将命令发送到powershell并读取响应。因此emacs可以快速获得反射结果。) 当代码用于var完成事物的声明时,问题就来了。这意味着未明确指定类型,并且补全将不起作用。 使用var关键字声明变量时,如何可靠地确定使用的实际类型?只是要清楚一点,我不需要在运行时确定它。我想在“设计时”确定它。 到目前为止,我有这些想法: 编译并调用: 提取声明语句,例如`var foo =“ a string value”;` 连接语句`foo.GetType();` 动态将生成的C#片段编译为新程序集 将程序集加载到新的AppDomain中,运行片段并获取返回类型。 卸下并丢弃组件 我知道该怎么做。但是,对于编辑器中的每个完成请求,这听起来都是非常沉重的。 我想我不需要每次都需要新的AppDomain。我可以将单个AppDomain重复用于多个临时程序集,并在多个完成请求中分摊设置和拆除它的成本。这更多是对基本概念的调整。 编译并检查IL 只需将声明编译到模块中,然后检查IL,以确定编译器推断出的实际类型。这怎么可能?我将用什么来检查IL? 还有更好的主意吗?注释?建议? 编辑 -对此进行进一步的考虑是不可接受的,因为调用可能会产生副作用。因此,必须排除第一个选项。 另外,我想我不能假设存在.NET 4.0。 更新 -上面没有提到的正确答案,但由埃里克·利珀特(Eric Lippert)轻轻指出,是实现完整的保真类型推断系统。这是在设计时可靠地确定var类型的唯一方法。但是,这也不容易做到。因为我没有幻想要尝试构建这样的东西,所以我选择了选项2的快捷方式-提取相关的声明代码,并进行编译,然后检查生成的IL。 实际上,这对于完成方案的相当一部分是有效的。 例如,假设在以下代码片段中,?是用户要求完成的位置。这有效: var x = "hello there"; x.? 完成将认识到x是一个String,并提供适当的选项。它通过生成并编译以下源代码来完成此操作: namespace N1 { static class dmriiann5he …

2
使用PropertyInfo找出属性类型
我想动态地分析对象树以进行一些自定义验证。验证本身并不重要,但我想更好地了解PropertyInfo类。 我会做这样的事情, public bool ValidateData(object data) { foreach (PropertyInfo propertyInfo in data.GetType().GetProperties()) { if (the property is a string) { string value = propertyInfo.GetValue(data, null); if value is not OK { return false; } } } return true; } 目前,我真正关心的唯一部分是“如果属性是字符串”。我如何从PropertyInfo对象中找出它是什么类型。 我将不得不处理一些基本的东西,例如字符串,整数,双打。但是我也必须处理对象,如果是这样,我将需要遍历这些对象内部的对象树以验证其中的基本数据,它们还将具有字符串等。 谢谢。
108 c#  .net  reflection 

15
将整数转换为Long
我需要使用反射获取字段的值。碰巧的是,我并不总是确定字段的数据类型是什么。为此,为了避免某些代码重复,我创建了以下方法: @SuppressWarnings("unchecked") private static <T> T getValueByReflection(VarInfo var, Class<?> classUnderTest, Object runtimeInstance) throws Throwable { Field f = classUnderTest.getDeclaredField(processFieldName(var)); f.setAccessible(true); T value = (T) f.get(runtimeInstance); return value; } 并使用如下方法: Long value1 = getValueByReflection(inv.var1(), classUnderTest, runtimeInstance); 要么 Double[] value2 = getValueByReflection(inv.var2(), classUnderTest, runtimeInstance); 问题是我似乎无法转换Integer为Long: java.lang.ClassCastException: java.lang.Integer cannot be cast to java.lang.Long …
108 java  reflection  casting 


2
使用reflect,如何设置结构字段的值?
在使用reflect包处理结构字段时遇到了麻烦。特别是,还没有弄清楚如何设置字段值。 输入t struct {fi int; fs字符串} var rt = t {123,“ jblow”} var i64 int64 = 456 获取字段i的名称-这似乎起作用 var field = reflect.TypeOf(r).Field(i).Name 以a)接口{},b)int的形式获取字段i的值-这似乎可行 var iface interface{} = reflect.ValueOf(r).Field(i).Interface() var i int = int(reflect.ValueOf(r).Field(i).Int()) 设置字段i的值-尝试一次-紧急 reflect.ValueOf(r).Field(i).SetInt( i64 ) 恐慌:使用未导出字段获得的值来反映reflect.Value·SetInt 假设它不喜欢字段名称“ id”和“ name”,因此将其重命名为“ Id”和“ Name” a)这个假设正确吗? b)如果正确,则认为没有必要,因为在同一文件/软件包中 设置字段i的值-尝试两个(字段名大写)-紧急 reflect.ValueOf(r).Field(i).SetInt( 465 ) reflect.ValueOf(r).Field(i).SetInt( …

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.