Tag: reflection

Delegate.CreateDelegate与DynamicMethod vs Expression

关于使反思飞行和探索代表的问题 …… 如果我需要为动态加载类型的方法创建委托Func ,我可能会使用(1) Delegate.CreateDelegate (2) DynamicMethod (3) Expression树。 让我们说一组动态加载的类型/方法在应用程序启动时通过config反映一次,并在应用程序的整个生命周期中使用(启动性能不是问题,也不是内存),代理被缓存并分派到一个强烈的方式。 这些代理是同时访问的热路径。 您更喜欢哪种动态绑定方法?为什么?

在任何时候访问类属性(获取或设置)时执行的方法?

C# – .net 3.5 我有一系列inheritance自同一基类的类。 我希望在访问(获取或设置)derrived类中的属性时调用基类中的方法。 但是,我不想在每个属性中编写代码来调用基类…相反,我希望有一种声明方式将此活动“接收”到基类中。 在需求中添加一些spice,我需要确定访问的属性的名称,属性值及其类型。 我想解决方案将是委托,generics和reflection的巧妙组合。 我可以设想在运行时创建某种类型的委托分配数组,但是在构造函数中迭代MemberInfo会影响性能,而不是我想要的。 同样,我希望有更直接的“声明”方式来做到这一点。 任何想法都非常感谢!

在编译aspx页面的动态程序集期间,不会触发AssemblyResolve事件

这个真的在惹恼我。 开始: 我的目标是在运行时加载包含嵌入式aspx,ascx等的程序集。我还想要的是不要将程序集文件锁定在磁盘上,以便我可以在运行时更新它而无需重新启动应用程序(我知道)这将使以前的版本加载)。 为此,我编写了一个虚拟路径提供程序来完成这一操作。 我订阅了CurrentDomain.AssemblyResolve事件,以便将框架重定向到我的程序集。 问题是,当框架尝试编译aspx页面的动态程序集时,我得到以下内容: 编译器错误消息:CS0400:在全局命名空间中找不到类型或命名空间名称“Pages”(您是否缺少程序集引用?) 源错误:公共类app_resource_pages__version_1_0_0_0__culture_neutral__publickeytoken_null_default_aspx:global :: Pages._Default,System.Web.SessionState.IRequiresSessionState,System.Web.IHttpHandle 我注意到,如果我使用Assembly.Load(AssemblyName)或Assembly.LoadFrom(filename)加载程序集,我不会得到上述错误。 如果我用Assembly.Load(byte [])加载它(以便不锁定它),抛出exception但是我的AssemblyResolve处理程序在被调用时正确地返回程序集(它被调用一次)。 所以我猜测它在框架解析asp标记时调用一次,而不是在它尝试为aspx页面创建动态程序集时调用。

如何用类型调用default(T)?

在c#中,我可以使用default(T)来获取类型的默认值。 我需要在运行时从System.Type获取默认类型。 我怎样才能做到这一点? 例如某事(这不起作用) var type = typeof(int); var defaultValue = default(type);

如何判断方法返回哪个接口

鉴于此代码段可以轻松粘贴到Linqpad中(或在Visual Studio控制台解决方案中稍作修改): void Main() { var cat = this.GetCat(); var dog = this.GetDog(); cat.Think(); cat.ThinkHarder(); //dog.Think(); // Does not compile. //dog.ThinkHarder(); // Does not compile. //if ([dog is returned as ISmartAnimal]) // What to put here? ((ISmartAnimal)dog).Think(); // Compiles, runs, but shouldn’t. reportTypeProperties(cat); reportTypeProperties(dog); } interface IAnimal { string Name { get; set; } } […]

枚举Outlook ContactItem属性

我正在尝试使用以下代码枚举Microsoft.Office.Interop.Outlook.ContactItem对象的属性(让我们称之为ci): System.Reflection.BindingFlags bf = System.Reflection.BindingFlags.Default; foreach (System.Reflection.PropertyInfo pi in ci.GetType().GetProperties(bf)) { Console.WriteLine(“Property Info {0}”, pi.Name); } 我实际上尝试了几种BindingFlag值的组合,但是没有返回任何属性。 这是ContactItem的定义方式:使用System.Runtime.InteropServices; namespace Microsoft.Office.Interop.Outlook { [Guid(“00063021-0000-0000-C000-000000000046”)] [CoClass(typeof(ContactItemClass))] public interface ContactItem : _ContactItem, ItemEvents_10_Event { } } 这就是_ContactItem的定义方式(为简单起见,我只保留了3个道具): using System; using System.Runtime.InteropServices; namespace Microsoft.Office.Interop.Outlook { [TypeLibType(4160)] [Guid(“00063021-0000-0000-C000-000000000046”)] public interface _ContactItem { [DispId(14848)] string Account { get; set; } [DispId(63511)] Actions […]

获取属性名称的扩展方法

我有一个扩展方法来获取属性名称 public static string Name(this Expression<Func> expression) { MemberExpression body = (MemberExpression)expression.Body; return body.Member.Name; } 我称之为 string Name = ((Expression<Func>)(() => this.PublishDateTime)).Name(); 这工作正常,并将PublishDateTime作为字符串返回给我。 但是我对调用语句有一个问题,它看起来太复杂了,我想要这样的东西。 this.PublishDateTime.Name() 有人可以修改我的扩展方法吗?

循环派生的DbContext DbSets,这样我就可以在我的DbContext对象中添加一个ClearAll()扩展

基于[ Type.IsGenericType和Type.IsGenericTypeDefinition ] [1]之间的差异,我获得了我缺少的信息,以便能够通过Reflection检索DbContext的DbSet。 但是,我现在被困在其他地方。 在下面的代码示例中,我确实成功获取了DbSetgenerics实例,但我现在希望能够在编译时将它们转换为特定的generics类型定义。 dbSet是来自我的DbContext的DbSets 之一的真实实例,但是如何将它转换为真正的类型定义? (进行第一次循环迭代,dBSet将代表DbSet – 如何在编译时对此变量强制执行此类型? 更新 :我刚刚审查了我要做的事情……恐怕没有意义/这是不可能的。 由于真实类型仅在运行时被发现,因此我无法在此之前(并且编译时间是之前的某个阶段)与真实的generics类型相关。 在任何情况下 – 我真正感兴趣的是,在编译时,IDE显示IEnumerable成员(DbSet 实现它)。 所以我真的需要把它转换为DbSet 。 这样的演员怎么样? 可能吗 ?! private static void Main(string[] args) { MyDb myDb = new MyDb(); List dbSetProperties = myDb .GetType() .GetProperties() .Where(pi => pi.PropertyType.IsGenericType && string.Equals(pi.PropertyType.GetGenericTypeDefinition().FullName, typeof(DbSet).FullName, StringComparison.OrdinalIgnoreCase)).ToList(); foreach (PropertyInfo dbSetProperty in dbSetProperties) { Type[] typeArguments […]

如何使用reflection获取C#静态类属性的名称?

我想创建一个C#Dictionary,其中key是类中静态属性的字符串名称,value是属性的值。 给定名为MyResources.TOKEN_ONE的类中的静态属性,如何获取属性的名称而不是其值? 我只关心属性名称的末尾部分(例如“TOKEN_ONE”)。 我编辑过这个,提到我不想映射字典中的所有属性值,只是该类中所有内容的一小部分。 所以假设我想获得单个属性的名称。 给定MyResources.TOKEN_ONE,我想回到“MyResources.TOKEN_ONE”或只是“TOKEN_ONE”。 这是一些示例代码,显示了我正在尝试做的事情。 我需要属性名称,因为我正在尝试生成一个javascript变量,其中我将属性名称映射到变量名称,将属性值映射到变量值。 例如,我希望C#Dictionary生成如下所示的行: var TOKEN_ONE =“一个”; using System; using System.Collections.Generic; namespace MyConsoleApp { class Program { static void Main(string[] args) { Dictionary kvp = new Dictionary(); // How can I use the name of static property in a class as the key for the dictionary? // For example, I’d […]

访问结构的字段

为什么以下代码不产生输出? static void Main(string[] args) { FieldInfo[] fi = typeof(MyStruct).GetFields(BindingFlags.Public); foreach (FieldInfo info in fi) { Console.WriteLine(info.Name); } } public struct MyStruct { public int one; public int two; public int three; public int four; public int five; public int six; public bool seven; public String eight; }