Tag: reflection

从Action 获取参数

如何将参数传递给Action ? 代码示例应该突出我想要实现的目标。 对不起,这有点长。 class Program { static void Main(string[] args) { Foo foo = new Foo(); foo.GetParams(x => x.Bar(7, “hello”)); } } class Foo { public void Bar(int val, string thing) { } } static class Ex { public static object[] GetParams(this T obj, Action action) { // Return new object[]{7, “hello”} } } […]

在.NET中使用属性的性能开销

1 ..属性的使用是否有任何性能开销? 想想一个类: public class MyClass { int Count {get;set;} } 它有10个属性(属性是类,其中属性类本身比MyClass本身大,如: public class FirstAttribute : Attribute { int A,B,C,D,E,F,G,H,I,J … {get;set;} } 2 ..每次MyClass实例化时,其中10个属性是否是内存开销? ( FirstAttribute是MyClass大小的10倍,将使用其中的10个进行修饰,因此实际对象本身与其上装饰的属性的总大小相比非常小。)这是一个问题吗? 3 ..这种情况对于结构是否有任何不同(结构是值类型和属性是引用类型)? 4 ..存储在内存中的属性与它们所附着的对象有何关系? 他们是如何联系在一起的? 5 ..一旦初始化MyClass或使用reflection检索属性,属性是否已初始化?

如何使用C#中的Reflection使用属性查找控制器? (或如何构建动态Site.Master菜单?)

也许在进入标题问题之前我应该​​备份并扩大范围…… 我目前正在ASP.NET MVC 1.0中编写一个Web应用程序(虽然我的PC上安装了MVC 2.0,所以我并不完全限于1.0) – 我已经开始使用标准的MVC项目了基本的“欢迎使用ASP.NET MVC”,并在右上角显示[Home]选项卡和[About]选项卡。 很标准,对吗? 我添加了4个新的Controller类,我们称之为“天文学家”,“生物学家”,“化学家”和“物理学家”。 附加到每个新控制器类的是[Authorize]属性。 例如,对于BiologistController.cs [Authorize(Roles = “Biologist,Admin”)] public class BiologistController : Controller { public ActionResult Index() { return View(); } } 这些[Authorize]标签自然限制哪些用户可以根据角色访问不同的控制器,但我想根据用户所属的角色在Site.Master页面的网站顶部动态构建一个菜单。 例如,如果“JoeUser”是角色“天文学家”和“物理学家”的成员,导航菜单会说: [主页] [天文学家] [物理学家] [关于] 当然,它不会列出“生物学家”或“化学家”控制器索引页面的链接。 或者,如果“JohnAdmin”是角色“Admin”的成员,则指向所有4个控制器的链接将显示在导航栏中。 好吧,你们大家都有了想法…现在回答真正的问题…… 从StackOverflow主题关于ASP.NET中动态菜单构建的答案开始,我试图理解如何完全实现它。 答案建议扩展Controller类(称之为“ExtController”),然后让每个新的WhateverControllerinheritance自ExtController。 我的结论是,我需要在这个ExtController构造函数中使用Reflection来确定哪些类和方法附加了[Authorize]属性来确定角色。 然后使用静态字典,将角色和控制器/方法存储在键值对中。 我想象它是这样的: public class ExtController : Controller { protected static Dictionary<Type,List> ControllerRolesDictionary; protected override […]

如何在代码外定义AutoMapper映射,即在XML文件中或使用不同的方法进行完全可配置的对象映射?

编辑:最初我打算使用AutoMapper来实现我的目标,但我必须知道AutoMapper并不打算以这种方式工作。 它为您提供了创建配置文件的可能性,但在我的情况下(完全可配置)我需要为每个参数组合一个配置文件,所以我想出了一个自己的方法,看看答案。 从AutoMapper wiki我学会了创建一个简单的映射 Mapper.CreateMap().ForMember(dest => dest.Title, opt => opt.MapFrom(src => src.Title)); Mapper.CreateMap().ForMember(dest => dest.EventDate, opt => opt.MapFrom(src => src.EventDate.Date)); Mapper.CreateMap().ForMember(dest => dest.EventHour, opt => opt.MapFrom(src => src.EventDate.Hour)); Mapper.CreateMap().ForMember(dest => dest.EventMinute, opt => opt.MapFrom(src => src.EventDate.Minute)); 像两个class public class CalendarEvent { public DateTime EventDate; public string Title; } public class CalendarEventForm { public DateTime EventDate […]

C#:返回给定对象和方法名称的委托

假设我有一个对象和一个包含方法名称的字符串,我该如何将委托返回给该方法(该方法?)? 例: MyDelegate GetByName(ISomeObject obj, string methodName) { … return new MyDelegate(…); } ISomeObject someObject = …; MyDelegate myDelegate = GetByName(someObject, “ToString”); //myDelegate would be someObject.ToString 提前致谢。 还有一件事 – 我真的不想使用switch语句,即使它可以工作但是需要很多代码。

如何使用C#中的Reflections从.cs文件中获取类和方法。

如何获取’.cs’文件中可用的类。? 就像我们可以在程序集中使用的类和方法一样, Assembly.GetTypes() and Type.GetMethods() 获取程序集中的类和方法。 类似地,如何获取C#文件(.cs文件)中的所有类。? 我需要在.cs文件中获取类 ,我可以从中轻松获取其中的方法以及方法参数等详细信息。

如何查找调用方法C#的完整名称

如何在c#中找到调用方法的全名。 我见过解决方案: 我如何在C#中获取调用方法 如何找到调用当前方法的方法? 从Called函数获取调用函数名称 但他们只给我顶级水平。 考虑这个例子: namespace Sandbox { class Program { static void Main(string[] args) { test(); } static void test() { var stackTrace = new StackTrace(); var methodBase = stackTrace.GetFrame(1).GetMethod(); Console.WriteLine(methodBase.Name); } } } 这只是输出’Main’如何让它打印’Sandbox.Program.Main’? 在任何人开始询问我为什么需要使用它之前,它是一个我正在处理的简单日志框架。 编辑 添加到Matzi的答案: 这是解决方案: namespace Sandbox { class Program { static void Main(string[] args) { test(); } […]

C#将不同版本的程序集加载到同一项目中

我正在创建一些执行NUnit等多个操作的工具。 在这个工具里面,我打开.dll程序集并调用方法形成它来运行一些测试。 一切都好,直到我需要重新加载.dll,程序重启。 我们的想法是,当工具运行时,我们将所需的程序集复制到一些临时文件夹并从那里调用。 如果我需要重新加载,我将另一个复制到另一个临时文件夹,并尝试从另一个文件夹加载新复制并加载到以前的程序集对象 ExecutingAssembly = Assembly.LoadFrom(AssemblyFullPath); 但我的问题是,在我将AssemblyFullPath更改为新的并调用Assembly.LoadFrom之后,它只返回旧程序集第一次加载的内容而不是第二次加载的内容! 也许问题是我们无法加载不同版本的几个程序集? 解决办法是什么?

DynamicMethod具有generics类型参数

是否可以使用generics类型参数定义DynamicMethod? MethodBuilder类具有DefineGenericParameters方法。 DynamicMethod有对应的吗? 例如,是否可以使用DynamicMethod创建具有签名的方法? void T Foo(T a1, int a2)

使用reflection创建通用List

我有一个属性IEnumerable 。 如何创建一个创建新List并分配该属性的generics方法? IList list = property.PropertyType.GetGenericTypeDefinition() .MakeGenericType(property.PropertyType.GetGenericArguments()) .GetConstructor(Type.EmptyTypes); 我不知道T型在哪里可以是任何东西