Tag: reflection

在c#中获取方法的调用者

有没有办法获取调用某个方法的类的实例?

ParameterInfo.IsLcid或ParameterInfo.IsRetval何时为true?

我在谷歌搜索时在Stack Overflow中找到了这个问题,但它已被删除。 所以我再次列出这个问题。 由于我在BCL中找不到LcidAttribute或RetvalAttribute ,我猜C#没有提供对locale identifier参数和返回值参数的支持。 是吗? 谢谢大家。

使用FieldInfo.SetValue与LINQ表达式在结构中设置字段

我想使用LINQ表达式设置私有字段。 我有这个代码: //parameter “target”, the object on which to set the field `field` ParameterExpression targetExp = Expression.Parameter(typeof(object), “target”); //parameter “value” the value to be set in the `field` on “target” ParameterExpression valueExp = Expression.Parameter(typeof(object), “value”); //cast the target from object to its correct type Expression castTartgetExp = Expression.Convert(targetExp, type); //cast the value to its correct […]

如何使用reflection找到特定的generics过载?

我正在尝试创建一个将调用特定generics重载方法的Expression (在我的第一个测试用例中为Enumerable.Average )。 特定类型绑定直到运行时才知道,因此我需要使用Reflection来查找和创建正确的generics方法( Expression是从解析后的文本创建的)。 所以,如果我在运行时知道我想找到这个特定的重载: public static double Average(this IEnumerable source, Func selector) 如何使用reflection解析特定的MethodInfo ? 到目前为止,我有以下选择声明: MethodInfo GetMethod(Type argType, Type returnType) { var methods = from method in typeof(Enumerable).GetMethods(BindingFlags.Public | BindingFlags.Static) where method.Name == “Average” && method.ContainsGenericParameters && method.GetParameters().Length == 2 && // and some condition where method.GetParameters()[1] is a Func that returns type […]

在C#中注册所有已声明的类的子类

在我正在研究的概念validation项目中,我有一个通用的抽象类,我期望通过许多子类扩展它: public abstract class Pet { public abstract string PetTypeName {get;} } public class Dog : Pet { public override string PetTypeName { get { return “Dog”; } } } 我想要一个静态集合,其中包含此类的所有子类型: public static List AllPetTypes = new List { typeof(Dog), typeof(Cat), //… }; 但是,当我们想要引入一个新的子类型时,这又增加了一个步骤,并且它容易出错,因为它只是程序员在运行时忘记做的事情。 如何自动创建这样的集合,包括inheritance给定父类的程序集中的每个类型? 编辑 作为回应做我将使用它的问题: 由于我们有多个客户端使用相同的SaaS产品,但可以访问门户网站“渠道”的不同子集,因此很难跟踪用户访问特定页面的方式,以及点击“完成”后应将其发送到何处“。 因此,我正在为ASP.NET门户网站创建架构的可能性,其中每个页面实际上都是一个增强的用户控件,它接受一个特定的强类型类来保存其参数,以及跟踪面包屑,URL创建所涉及的所有任务。并将其抽象出框架。 因此,框架需要知道可以像页面一样处理的所有控件。 理想情况下,在框架中创建新的用户控件并使其代码隐藏类扩展某个基类就足以将该控件注册为系统中的新页面。 这让我想到了下一个问题:将使用提出的解决方案中提到的技术在给定程序集中查找类型,在ASP.NET Web项目的上下文中工作,其中类型在代码隐藏中声明? 我不确定用户控件在什么时候被编译,或者它们被认为是Web项目程序集的一部分。 有没有人有额外的见解? […]

在C#中,有一种方法可以使用reflection检索内置数据类型属性

使用reflection我想从C#对象中仅检索内置数据类型属性。 有没有更好的方法,然后使用一堆|| (ors)在Where方法中指定我感兴趣的类型? Type sourceType = typeof(TSource); var props = sourceType.GetProperties() .Where(pi => pi.PropertyType == typeof(int) || pi.PropertyType == typeof(string)); // …. etc.

从baseclass创建子类的克隆副本

考虑这种情况: public class Base { public int i; } public class Sub : Base { public void foo() { /* do stuff */} } 然后我想,给定一个Base的实例得到一个Sub的克隆实例(在这种情况下i = 17),这样我就可以在子类中调用foo 。 Base b = new Base { i=17 }; Sub s = CloneAndUpcast(b); s.foo(); 但是,我该如何创建CloneAndUpcast ? 我认为应该可以使用reflection递归克隆所有Base -members和属性。 但相当一些工作。 谁有更好,更整洁的想法? PS。 我正在考虑使用它的场景是一组树状结构中的“简单”类(这里没有循环图或类似的),所有类都是简单的值持有者。 计划是拥有一个包含所有值的愚蠢层,然后是一组类似的类(子类),它们实际上包含了值持有者不应该注意的一些业务逻辑。 一般不好的做法是的。 我认为它适用于这种情况。

C#仅使用代码添加引用(没有IDE“添加引用”function)

我正在为一个程序编写一个插件,我想把我的代码放在一个DLL中,这样我就可以自由地共享插件而不暴露(赠送)我的代码。 这是我可以访问的基本结构: using System; public class Plugin { public void Initialize() { //do stuff here doWork(); } } 然后我只引用我的代码所在的.cs文件,程序“吃掉”这个插件。 现在,我已经在其中放置了几个逻辑,主要包括不直接绑定到“Initialize()”的函数,仅在启动整个系统的doWork()函数上。 现在,我想将所有代码放在DLL中,然后从Initialize(),myDll.doWork()(或类似的东西)中调用。 PS:这个dll将是一个已编译的C#库(它可以称为动态程序集导入吗?它不会真正动态,因为它会在执行前编译,对吧?) PS2:这样我还可以添加自定义资源,如表单,图片等,没有太大困难吗? PS3:是否有一个免费的工具来保护这种DLL内的代码? (即避免重新设计) 在此先感谢=)

使用IsDefined而不是GetCustomAttributes有什么好处

考虑一个程序集包含一个或多个属于自定义属性MyAttribute类型的情况,您需要获取这些类型的列表。 除了更紧凑的语法之外,使用IsDefined与GetCustomAttributes有什么好处? 是否暴露/隐藏了另一个没有的东西? 一个比另一个更有效吗? 以下是演示每种用法的代码示例: Assembly assembly = … var typesWithMyAttributeFromIsDefined = from type in assembly.GetTypes() where type.IsDefined(typeof(MyAttribute), false) select type; var typesWithMyAttributeFromGetCustomAttributes = from type in assembly.GetTypes() let attributes = type.GetCustomAttributes(typeof(MyAttribute), false) where attributes != null && attributes.Length > 0 select type;

使用对象类型的字符串名称在c#中键入cast

我有以下代码,应该很容易通过 public class Foo { public void FooHasAMethod() { Console.WriteLine(“it is me, foo!!!”); } } public class Bar { public Foo FooProperty { get; set; } } public class FooBar { public static void Main() { Bar bar = new Bar{ FooProperty = new Foo() }; CallPropertyByName(bar, “Foo”); } public static void CallPropertyByName(Bar bar, string […]