Tag: reflection

如何获取源文件名和类型成员的行号?

考虑到调试数据文件可用(PDB)并使用System.Reflection或其他类似框架(如Mono.Cecil) ,如何以编程方式检索源文件名和类型或类型成员的行号声明。 例如,假设您已将此文件编译为程序集: C:\ MyProject的\ Foo.cs 1: public class Foo 2: { 3: public string SayHello() 4: { 5: return “Hello”; 6: } 7: } 怎么做这样的事情: MethodInfo methodInfo = typeof(Foo).GetMethod(“SayHello”); string sourceFileName = methodInfo.GetSourceFile(); // ?? Does not exist! int sourceLineNumber = methodInfo.GetLineNumber(); // ?? Does not exist! sourceFileName将包含“C:\ MyProject \ Foo.cs”,sourceLineNumber将等于3。 更新: System.Diagnostics.StackFrame确实能够获取该信息,但仅限于当前执行调用堆栈的范围。 这意味着必须首先调用该方法。 […]

便携式类库和reflection

我正在为Desktop,Windows 8商店和Windows手机同时构建新的应用程序。 所以我创建了可移植类库,以便在所有平台上具有通用function。 我的问题是,当我尝试在PCL中重用我的代码时,我无法访问库中的一些方法和属性。 根据MSDN,支持这些方法,但我现在知道为什么我无法访问它们。 var property = memberExpression.Member as PropertyInfo; if (property == null) { } var getMethod = property.GetGetMethod(true); if (getMethod.IsStatic) {} 这是无法编译的代码片段。 GetGetMethod和IsStatic在Visual Studio编辑器中是红色的。 我不知道为什么会发生这种情况以及如何访问这些属性。 所以,如果那里的任何人做过类似的事情,请帮我编译这段代码。

IsAssignableFrom()在返回true时返回false

我正在开发一个插件系统,它可以加载包含在指定文件夹中的.dll。 然后我使用reflection来加载程序集,遍历它们包含的类型并识别任何实现我的IPlugin接口的程序。 我正在检查这个代码类似于以下代码: foreach(Type t in myTypes ) { if( typeof(IPlugin).IsAssignableFrom(t) ) { … } } 出于某种原因,IsAssignableFrom()在返回true时保持返回false。 我已经尝试通过显式赋予它一个应该传递的类型替换t ,并且它工作正常,但由于某种原因它不能处理从加载的程序集返回的类型。 为了让事情变得陌生,代码在我的同事的机器上工作正常,但在我的机器上却没有。 有谁知道任何可能导致这种行为的事情? 谢谢

应该是两种不相等的类型

我正在尝试调试一些使用reflection来加载插件的代码 这是调试代码: Type a = methodInfo.GetParameters()[0] .ParameterType.BaseType; Type b = typeof(MessageContext); Debug.WriteLine(a.AssemblyQualifiedName); Debug.WriteLine(b.AssemblyQualifiedName); Debug.WriteLine(a.Equals(b)); 这是它的输出: OrtzIRC.Common.MessageContext,OrtzIRC.Common,Version = 1.0.0.0,Culture = neutral,PublicKeyToken = null OrtzIRC.Common.MessageContext,OrtzIRC.Common,Version = 1.0.0.0,Culture = neutral,PublicKeyToken = null 假 我不明白是什么让这两种类型不同?

如果反思效率低下,何时最合适呢?

我发现很多案例,我认为我可以使用relfection来解决问题,但我通常不这样做,因为我听到了很多“不使用reflection,效率太低”的说法。 现在我处于一个我遇到问题的位置,我找不到任何其他解决方案而不是使用new T()reflection,如本问答中所述 。 所以我想知道是否有人可以告诉我反思的具体用途,以及是否有一套指导方针来表明它何时合适以及什么时候不合适?

如何在C#.NET中深层复制不同类型的对象

我需要按字段名称映射ObjectV1和ObjectV2之间的所有字段值和子集合。 ObjectV2与ObjectV1位于不同的namspace中。 模板ClassV1和ClassV2之间的inheritance已被打折扣,因为这两个类需要独立发展。 我考虑过使用reflection(慢速)和二进制序列化(也很慢)来执行公共属性的映射。 有首选方法吗? 还有其他选择吗?

动态JContainer(JSON.NET)并在运行时迭代属性

我在MVC4 / .NET4 WebApi控制器操作中收到一个JSON字符串。 动作的参数是dynamic因为我在接收端对接收到的JSON对象一无所知。 public dynamic Post(dynamic myobject) 自动解析JSON,生成的dynamic对象是Newtonsoft.Json.Linq.JContainer 。 我可以按照预期在运行时评估属性,因此如果JSON包含类似myobject.myproperty的内容,那么我现在可以获取接收的动态对象并在C#代码中调用myobject.myproperty 。 到现在为止还挺好。 现在我想迭代作为JSON的一部分提供的所有属性,包括嵌套属性。 但是,如果我执行myobject.GetType().GetProperties()它只返回Newtonsoft.Json.Linq.JContainer的属性而不是我正在寻找的属性(它们是JSON的一部分)。 知道怎么做吗?

如何使用reflection调用静态构造函数?

如何获取静态构造函数的ConstructorInfo ? public class MyClass { public static int SomeValue; static MyClass() { SomeValue = 23; } } 我试过以下但失败了…. Type myClass = typeof (MyClass); // throws exception myClass.TypeInitializer.Invoke(null); // returns null (also tried deleting BindingFlags.Public ConstructorInfo ci = myClass.GetConstructor(BindingFlags.Static|BindingFlags.Public, System.Type.DefaultBinder, System.Type.EmptyTypes, null); // returns empty array ConstructorInfo[] clutchingAtStraws = myClass.GetConstructors(BindingFlags.Static| BindingFlags.Public);

C#反思:在解决方案中获取* all * active程序集?

inheritance人我的问题: 我有两个项目 – 一个’常见’项目,其行为类似于具有各种支持代码的库,以及在许多调用中使用该项目的实际程序。 我们将这些项目称为“共同”和“程序”。 它们都在同一个解决方案中。 在“Common”中,我有一个用于commoreflection任务的类,比如创建一个实例。 如果我调用GetExecutingAssembly,它将获得所有“公共”类型,但是当我使用GetEntryAssembly时,我得到“程序”类型。 虽然我当然可以编辑代码以使用2套asm,但我担心解决方案中不仅仅有2个项目的情况 – 比方说5(不知道为什么,但让我们去那里现在),我担心调用GetExecutingAssembly和GetEntryAssembly不会获得整个程序中的所有类型。 还有其他方法可以让所有类型都在解决方案中吗?

TypeDescriptor.GetProperties()vs Type.GetProperties()

请考虑以下代码。 Object obj; PropertyDescriptorCollection A = TypeDescriptor.GetProperties(obj); PropertyInfo[] B = obj.GetType().GetProperties(); // EDIT* 我试图理解A和B之间的区别。据我所知, TypeDescriptor.GetProperties()将返回自定义的TypeDescriptor属性,其中Type.GetProperties()只返回对象的内在“真实”属性。 这是正确的吗? 如果obj没有任何自定义的TypeDescriptor属性,那么它只是默认返回对象的文字内在属性。 * EDIT之前的第二行代码(返回值错误): PropertyDescriptorCollection B = obj.GetType()。GetProperties();