Tag: reflection

有没有办法获取传递给方法的参数数组?

说我有一个方法: public void SomeMethod(String p1, String p2, int p3) { #if DEBUG object[] args = GetArguments(); LogParamaters(args); #endif // Do Normal stuff in the method } 有没有办法检索传递给方法的参数数组,以便记录它们? 我有很多方法,并希望避免手动将参数按名称传递给记录器,因为人为错误将不可避免地蔓延。 我猜它会以某种forms涉及reflection – 这很好,因为它只会用于调试目的。 更新 更多信息: 我无法更改SomeMethod的方法签名,因为它作为WebMethod公开,并且必须复制它模拟的遗留系统。 遗留系统已经记录了传入的参数。从新实现开始将包装遗留系统,所以我希望记录进入C#版本的参数,以便我可以validation正确的参数是否传入按正确的顺序。 我只是想记录参数值和顺序,而不是它们的名字。

动态拦截.NET中的调用

我很想知道.NET是否支持在运行时进行任何forms的方法调用(或属性调用)动态拦截。 也就是说,您是否可以在没有静态编译信息(如接口(沿着CORBA DII( 链接文本 )或COM的IDispatch的行)的情况下拦截对对象的调用)。 如果没有,C#4.0中新的“动态类型对象”function是否有助于此。

如何获取属性设置的属性名称?

我将在不传递属性的任何参数的情况下执行此操作! 可能吗? class MyAtt : Attribute { string NameOfSettedProperty() { //How do this? (Would be MyProp for example) } } class MyCls { [MyAtt] int MyProp { get { return 10; } } }

获取自定义程序集属性而不加载到当前AppDomain中

我创建了一个小应用程序来递归加载提供的目录中的程序集并读取它们的自定义属性集合。 主要是阅读DebuggableAttribute来确定IsJITTrackingEnabled和IsJITOptimizerDisabled的设置,以确定程序集是否针对发布进行了优化。 我当前的代码执行Assembly.LoadFrom以传递到程序集的整个路径并加载它。 然后在程序集上执行GetCustomAttributes以获取debuggable属性。 问题是每个程序集都加载到当前的appdomain中。 因此,如果另一个文件夹使用相同的程序集,它只使用最初加载的引用。 我希望能够加载程序集,读取我需要的属性,然后卸载它。 我尝试创建一个新的appdomain并将程序集加载到其中然后卸载程序集后跟无济于事。 我知道这一定是可能的,但我不知所措。 任何帮助将不胜感激。 我很乐意提供您可能需要的任何其他信息。

为什么C#switch语句不允许使用typeof / GetType()?

如下例所示: switch ( myObj.GetType ( ) ) { case typeof(MyObject): Console.WriteLine ( “MyObject is here” ); break; }

如何从* .dll中检索所有公共方法

我有* .dll用C#编写,我需要得到* .dll中包含的所有公共方法或类的列表。 有没有办法用C#以编程方式进行?

使用GetType()进行转换

是否可以将对象GetType()转换为从GetType()返回的类型? 我想要一个可以接受一个对象(对于匿名类型)的generics方法,但然后返回一个转换为匿名类型的对象。 我一直在考虑使用LCG DynamicMethod在容器类上构建一个方法,但我无法弄清楚它会是什么样子。 使用GetType()方法进行GetType()的想法是能够获取匿名类型并将对象强制转换为其实际类型,而无需实际知道类型。 最重要的目标是将匿名类型的对象粘贴到容器中,然后我可以在方法之间共享和传递。

使用reflection在dll中获取某些基类型的所有类

我有一个dll,它包含许多都inheritance自CommandBase类的类。 我正在尝试使用C#中的reflection来获取所有这些类(CommandA,CommandB,CommandC等)的实例,以便我可以在每个类上调用特定方法。 这是我到目前为止: //get assemblies in directory. string folder = Path.Combine(HttpContext.Current.Server.MapPath(“~/”), “bin”); var files = Directory.GetFiles(folder, “*.dll”); //load each assembly. foreach (string file in files) { var assembly = Assembly.LoadFile(file); if (assembly.FullName == “MyCommandProject”) { foreach (var type in assembly.GetTypes()) { if (!type.IsClass || type.IsNotPublic) continue; if(type is CommandBase) { var command = Activator.CreateInstance(type) as […]

使用Intellisense和编译时检查提取reflection的属性名称

好。 所以我有一些代码将winForm上的某些控件映射到对象中的某些属性,以便在数据发生某些事情时对控件执行某些操作。 一切都很好,工作得很好。 不是问题。 问题是,要将项添加到映射中,我调用的函数看起来像: this.AddMapping(this.myControl,myObject,”myObjectPropertyName”); 我遇到的问题是,在编译时很难说出上述行与下面的行之间的区别: this.AddMapping(this.myControl,myObject,”myObjectPropretyName”); 由于最后一个参数是一个字符串,因此没有编译时检查或类似的任何操作会强制字符串本身实际上对应于给定对象上的有效属性名称。 此外,Refactor和“查找所有引用”之类的内容错过了这种引用,当属性名称发生变化时会导致欢闹。 所以我想知道的是,如果有一些方法可以更改函数,那么我传入的内容仍然是以某种方式表示属性名称的字符串,但是编译时会检查实际值是否进入。有人说我可以用表达式树做到这一点,但我已经阅读了它们,似乎没有看到连接。 我喜欢做类似的事情: this.AddMapping(this.myControl,myObject,myObject.myObjectPropertyName); 甚至 this.AddMapping(this.myControl,myObject.myObjectPropertyName); 会很甜蜜! 有任何想法吗?

从Expression <Func >实例获取实际返回类型

我有一个接受Expression<Func>实例的方法。 我想得到特定表达式实例返回的实际数据类型,而不是object 。 我可以让它用于直接属性引用,所以如果我传入表达式x => x.IntegerProperty我可以得到一个整数的Type引用。 此方法需要将其转换为MemberExpression。 但是,我不能让它为任意表达式工作。 例如,如果表达式是x => x.IntegerProperty.ToString()我想获得字符串的Type引用。 我无法将其编译为MemberExpression,如果我只是.Compile()它并检查返回类型我得到“对象”。 如何查看特定的表达式实例并派生实际的返回类型?