Tag: reflection

Reflection.Emit:如何可靠地将MethodBuilder转换为RuntimeMethodInfo?

在动态生成类型并调用TypeBuilder.CreateType之后,我想创建一个指向新类型中的方法的委托。 但是,如果我使用像 loadedType = typeBuilder.CreateType(); myDelegate = (MyDelegate)Delegate.CreateDelegate( typeof(MyDelegate), methodBuilder); 将methodBuilder重用为methodInfo,我得到exception“MethodInfo必须是RuntimeMethodInfo”。 现在通常我可以重新获取MethodInfo MethodInfo mi = loadedType.GetMethod(methodBuilder.Name); myDelegate = (MyDelegate)Delegate.CreateDelegate(typeof(MyDelegate), mi); 但我的类可能包含几个具有相同名称的重载方法。 我怎样才能确保我找到合适的? 方法是否有一些我可以在loadedType中查找的持久标识符? 更新:好的,这是我用来重新获取MethodInfo的内容。 我只是希望我能确定它在所有情况下都有效。 private static MethodInfo ReacquireMethod(Type type, MethodInfo method) { BindingFlags flags = BindingFlags.DeclaredOnly; flags |= (method.IsPublic ? BindingFlags.Public : BindingFlags.NonPublic); flags |= (method.IsStatic ? BindingFlags.Static : BindingFlags.Instance); MethodInfo m = type.GetMethod(method.Name, […]

如何查找作为基类直接后代的类型?

我需要获得所有类型的程序集inheritance一些基类但只有第一个后代。 例如,如果我有: class Base { } class FirstClass : Base { } class SecondClass : FirstClass { } 现在 var directOnes = assembly.GetTypes().Where(t => t.IsSubclassOf(typeof(Base))); 应该只返回FirstClass而不是SecondClass 。 有办法找出来吗?

PostSharp如何在运行时知道某个方面是否应用于某个方法?

我正在实现PostSharp方面库,无法找到解决以下问题的方法。 假设我们有一个方面将应用于某些方法,而不会应用于其他方法。 我需要一些机制,我可以在运行时使用它来知道方面是否应用于方法。 具体来说, 在运行时确定某个方面是否应用于System.Reflection.MethodBase给定的特定方法的推荐方法是什么? 我想到的第一个解决方案是使PostSharp标记每个已被此方面修改的方法,并使用自定义属性并在运行时使用methodBase.CustomAttributes 。 这是解决问题的正确方法吗? 或者在PostSharp中已经有一个现成的或更优雅的解决方案。 另外,请注意首选的解决方案不需要付费的PostSharp许可证,因为Free Community Edition足以支持我当前的项目。 无论如何,讨论基于付费PostSharpfunction的解决方案也是非常有意义的。

如何重构这个?

我试图重构这个 class AClass { string Property1 { get; set; } string Property2 { get; set; } string Property3 { get; set; } void AMethod(AClass other) { if(String.IsNullOrEmpty(this.Property1)) { this.Property1 = other.Property1; } if(String.IsNullOrEmpty(this.Property2)) { this.Property2 = other.Property2; } if(String.IsNullOrEmpty(this.Property3)) { this.Property3 = other.Property3; } } } 而我唯一能做到的就是 private string GetFirstNotNullOrEmpty(string first, string second) { if […]

获取Enumerable.DefaultIfEmpty的methodinfo

我正在构建一些Linq Expression并试图获取IEnumerable.DefaultIfEmpty ( http://msdn.microsoft.com/en-us/library/bb360179.aspx )的MethodInfo。 什么似乎是一件容易的事,但我对它为什么不起作用毫无头绪。 typeof(Enumerable).GetMethod(“DefaultIfEmpty”, new[] { typeof(IEnumerable) }); typeof(Enumerable).GetMethod(“DefaultIfEmpty”, new[] { typeof(IEnumerable).MakeGenericType(typeof(WorkitemListModel)) });

由于反映安全问题,是否访问私有字段和属性?

我刚刚在这里发现,由于reflection,可以(至少在c#中)查找私有字段和属性。 我很惊讶,虽然我知道像DataContractSerializer类这样的构造需要访问它们的可能性。 现在的问题是,如果任何人都可以访问我class级的每个领域,这有点不安全,不是吗? 我的意思是如果有人有private bool _isLicensed字段。 它可以很容易地改变! 后来我在这里发现, 字段访问器并不是一种安全机制。 那么如何让我的应用程序安全,这意味着我如何阻止除我以外的任何人改变我的类中的基本状态值?

entity frameworkDbEntityEntry.Property方法是否使用reflection?

这个问题是关于这段代码的: entityEntry.Property(“WhateverProperty”).CurrentValue = 1; 我昨天回答了这个问题 ,如果你在问题的评论中注意到了(不是答案),其中一名成员@gertarnold说: entityEntry.Property(“InsertedBy”)不使用reflection,它读取EF元数据。 当然,它使用EF元数据来确定实体是否具有该属性,但我非常确定在某个地方,他们必须使用reflection来设置属性 。 我试着在这里 , 这里和这里查看源代码(第484行)然后加油。 所以问题是 : 它是否使用reflection? 如果没有,那么财产如何设定呢?

解析是获取成员类型的唯一方法吗?

下面的reflection代码返回: System.Collections.Generic.IList`1[TestReflection.Car] Cars 如何通过reflection获得Cars根类型? 不是IList – 我怎么能Car ? using System; using System.Reflection; using System.Collections.Generic; namespace TestReflection { class MainClass { public static void Main(string[] args) { Type t = typeof(Dealer); MemberInfo[] mi = t.GetMember(“Cars”); Console.WriteLine(“{0}”, mi[0].ToString()); Console.ReadLine(); } } class Dealer { public IList Cars { get; set; } } class Car { public string […]

如何迭代C#类查找特定类型的所有实例,然后在每个实例上调用方法

是否有可能(通过reflection?)迭代一个对象的所有字段,在每个字段上调用一个方法。 我有一个这样的课: public class Overlay { public Control control1; public Control control2; } 我想要一个像这样的方法: public void DrawAll() { Controls[] controls = “All instances of Control” foreach (Control control in Controls) { control.Draw() } } 可以这样做吗? 我已经能够获得Control类的所有元数据,但这只与特定实例的类型有关。 我知道这看起来很奇怪,但我有理由。 我正在使用Unity 3D,每个控件实际上都是由编辑器实例化的GUI控件。 谢谢你的帮助。

ASP.net UserControl和AppDomain TypeResolve

我正在使用VirtualPathProvider来包含编译时不可用的用户控件。 除了对实际包含控件的dll的引用外,一切都正常工作。 当调用具有控件的页面时,除非将dll放在bin文件夹中,否则无法找到控件类型。 错误:分析程序错误说明:解析为此请求提供服务所需的资源时发生错误。 请查看以下特定的解析错误详细信息并相应地修改源文件。 分析器错误消息:无法加载类型“App.Modules.ModuleA.Controls.Entity1Item”。 来源错误: 第1行: 我试图处理所有重要的AppDomain事件(AssemblyResolve,TypeResolve和ReflectionOnlyAssemblyResolve),但没有为我的类型调用。 我在TypeResolve文档中看到,只要执行Type.GetType并且找不到类型,就会调用它。 看起来像ASCX在需要它的类型时没有触发事件……为什么? 谢谢! 亚历克斯