Tag: reflection

C#库便于动态reflection

是否有任何库(如开源项目等)可以更容易地使用复杂的reflection,如动态创建对象或类,检查实例等? 谢谢

动态编译代码时发生IOException

我有以下代码行: CSharpCodeProvider c = new CSharpCodeProvider(); CompilerParameters cp = new CompilerParameters(); cp.ReferencedAssemblies.Add(“system.dll”); cp.CompilerOptions = “/t:library”; cp.GenerateInMemory = true; CompilerResults cr = c.CompileAssemblyFromSource(cp, sb.ToString()); 这会导致抛出IOException 。 附加信息:进程无法访问文件’C:\ Users \ Username \ AppData \ Local \ Temp \ _dgl5fb1i.err’,因为它正由另一个进程使用。 但是,这是耗费超过8GB RAM的大型程序的一部分。 在具有16GB RAM的系统上,不会抛出此exception。 动态编译的代码编译好并运行。 程序在具有足够RAM的系统上运行时没有任何错误。 该程序是为x64编译的。 请注意,我没有收到OutOfMemoryException或任何迹象表明程序内存不足。 在任务管理器中,内存使用率几乎在抛出IOException之前到达顶部。 什么可能导致这种行为,任何人都可以提出解决方案? 编辑 我修改了应用程序以使用更少的内存。 即使应用程序有足够的可用内存,错误仍然存​​在。 问题仍然只发生在一台机器上。 这可能与以下post有关: 阻止CompileAssemblyFromSource生成具有重复文件名的临时文件 。

无法从我的Silverlight应用程序调用Assembly.GetName()

我想在我的应用程序中显示我的应用程序版本号,最简单的方法是使用程序集的版本号。 var assembly = System.Reflection.Assembly.GetExecutingAssembly(); var name = assembly.GetName(); return String.Format(“Version {0}.{1}”, name.Version.Major, name.Version.Minor); 我可以毫无问题地获得正在执行的汇编,但是对GetName()的调用会返回带有此消息的MethodAccessException 尝试使用安全透明方法’MainPage..ctor()’来访问安全关键方法’System.Reflection.Assembly.GetName()’失败。 为什么会发生这种情况,有什么我可以做的,如果没有,还有其他方法来检索汇编版本吗?

从CLR样式类型的全名获取C#样式类型引用

给定通过reflection找到的.NET类型对象,是否可以将此类型打印或反编译为C#声明,同时考虑C#类型别名等? 例如, Int32 -> int String -> string Nullable -> int? List -> List 我希望能够打印出与源中最初编写的方法相近的方法。 如果.NET框架中没有任何内容,是否有第三方库? 我可能会看看ILSpy 。

询问MethodInfo需要多少参数的最有效方法是什么?

如果MethodInfo接受参数,那么询问MethodInfo的最有效方法是什么?如果接受,有多少? 我目前的解决方案是: methodInfo.GetParameters().Any()和methodInfo.GetParameters().Count() 。 这是最有效的方式吗? 由于我实际上并不需要任何ParameterInfo对象,有没有办法在不调用GetParameters()情况下执行此操作?

便携式类库reflection

我目前正在尝试将Xamarin.iOS应用程序库转换为PCL(配置文件78)。 我有这个不能编译的代码: public static void RegisterAllCommandHandlers(IEnumerable assemblies) { // Get all types that are concrete classes which implement ICommandHandler var commandHandlerOpenGenericType = typeof(ICommandHandler); var types = new List(); foreach (var assembly in assemblies) { types.AddRange(assembly.GetTypes() .Where(x => x.IsClass && !x.IsAbstract && x.GetInterfaces().Any(i => i.IsGenericType && i.GetGenericTypeDefinition() == commandHandlerOpenGenericType))); } } 这是编译器错误的图像: 如何使用新的reflectionAPI执行相同的操作?

通过reflection获取所有ICollection属性

我正在尝试从未知类型的类中获取所有ICollection属性。 此外,在编译时不知道类型T(集合的内容)。 首先我尝试过这种方法: foreach (var property in entity.GetType().GetProperties()) { if (typeof(ICollection).IsAssignableFrom(property.PropertyType) || typeof(ICollection).IsAssignableFrom(property.PropertyType)) { // do something } } 但它不起作用(即使对于ICollection属性也要评估为false)。 我得到它像这样工作: foreach (var property in entity.GetType().GetProperties()) { var getMethod = property.GetGetMethod(); var test = getMethod.Invoke(entity, null); if (test is ICollection) { // do something } } 但我不想执行所有的getter。 为什么第一段代码不起作用? 如何在不执行所有getter的情况下找到ICollection属性?

通过Activator.CreateInstance创建可为空的对象返回null

我正在创建一个将小脚本变成dll的系统。 当我尝试获取可以为空的值类并使其成为参数的默认值时,我遇到了问题。 问题是我需要在编译器中创建一个用户选择为nullable的实例,并将其设置为常量。 不幸的是,每当我使用Activator.CreateInstance(NullableType) (其中NullableType是来自用户输入的创建类型)时,我得到null作为返回值。 例如,只需执行: object Test = Activator.CreateInstance(typeof(Nullable)); Console.WriteLine(Test == null); 返回true。 这只发生在Nullables上。 在C#中创建的结构,甚至是通用结构,都可以很好地创建。 哎呀,如果我从DotNetReflector复制并粘贴nullable(并删除TypeDependencyAttribute,TargetPatchingOptOutAttribute和ThrowHelper调用,因为我没有访问权限),它会在上面显示False。 到底是怎么回事? 当我在运行时之前不知道通用参数时,还有其他可能的方法来创建可空吗?

使用Dynamic而不是reflect来按名称调用方法

使用.NET-4.0,如何在不使用reflection的情况下使用Dynamic来完成以下操作? public void InvokeMethod(string methodName) { Type t = typeof(GCS_WebService); GCS_WebService reflectOb = new GCS_WebService(); MethodInfo m = t.GetMethod(methodName); m.Invoke(reflectOb, null); }

reflection在抽象类的属性上找不到私有的setter

当我在抽象类中有这个属性时: public IList Components { get; private set; } 然后当我打电话: p.GetSetMethod(true) 如果p是一个指向我的属性的PropertyInfo对象,我得到null。 但是,如果我将属性setter更改为protected,我可以通过reflection看到它。 为什么是这样? 我似乎没有回忆起非抽象类的这个问题……