Tag: reflection

如何使用reflection查找数据注释属性及其参数

我有一些数据注释属性,如下所示: [StringLength(20, MinimumLength = 5, ErrorMessage = “First name must be between 5 and 20 characters”)] 如何使用reflection查找数据注释属性及其参数? 谢谢

拦截方法调用

有没有办法拦截一些方法调用而不对方法本身进行任何代码更改? 我不需要在运行时注入任何自定义行为,只需将自定义性能日志记录添加到现有项目。

在运行时使用新的匿名类型创建lambda表达式

我想调用一个需要这样的参数的方法: Expression<Func> expr 我需要在运行时构造这个参数,因为我不知道匿名类型之前会是什么样子; 它可以有任何数量的字段: x => new { a=xa, b=xb, c=xc, etc… } 我可以在运行时创建一个具有相同“签名”的类型(这是正确的词吗?)作为所需的匿名类型,但问题是:如何在运行时从那个构造这个lambda表达式? 特别是Expression.New让我烦恼,因为我需要传递一个构造函数信息,我必须从现有类型传递它(它确实可以是一个匿名类型,但我不能在运行时创建一个匿名类型。或者是否存在一种方法吗?)。 更新 (评论中要求的某些上下文) 我想调用的方法是: DependentNavigationPropertyConfiguration.HasForeignKey(Expression<Func> foreignKeyExpression) 我想这样做的原因是自动为从某个基类inheritance的实体创建一个导航属性,包括该外键中该基类的键。 因为实体可以有多个任何类型的键字段,所以TKey类型只在运行时才为我所知。

C# – 将属性值从一个实例复制到另一个实例,不同的类

我有两个C#类,它们具有许多相同的属性(按名称和类型)。 我希望能够将Defect实例中的所有非空值复制到DefectViewModel的实例中。 我希望用reflection来做,使用GetType().GetProperties() 。 我尝试了以下方法: var defect = new Defect(); var defectViewModel = new DefectViewModel(); PropertyInfo[] defectProperties = defect.GetType().GetProperties(); IEnumerable viewModelPropertyNames = defectViewModel.GetType().GetProperties().Select(property => property.Name); IEnumerable propertiesToCopy = defectProperties.Where(defectProperty => viewModelPropertyNames.Contains(defectProperty.Name) ); foreach (PropertyInfo defectProperty in propertiesToCopy) { var defectValue = defectProperty.GetValue(defect, null) as string; if (null == defectValue) { continue; } // “System.Reflection.TargetException: Object […]

如何实例化HttpPostedFile

我正在尝试与一个我无法控制的系统进行通信,但是其中一个方法接受了HttpPostedFile,我的代码中有一个字节数组。 有没有人有一个实例化HttpPostedFile的例子,因为我知道它的构造函数是内部的? 我发现的最好的是这个SOpost使用reflection然而他们被引导到另一个方向,我无法采取,因为我无法修改第三方系统方法签名。

具有未知类型的CreateDelegate

我正在尝试创建Delegate用于在运行时读取/写入未知类型的类的属性。 我有一个generics类Main和一个如下所示的方法: Delegate.CreateDelegate(typeof(Func), get) 其中get是应该读取的属性的MethodInfo 。 问题是当属性返回int (我猜这种情况发生在值类型中),上面的代码抛出了ArgumentException,因为该方法无法绑定。 在字符串的情况下,它运作良好。 为了解决这个问题,我更改了代码,以便使用MakeGenericType生成相应的Delegate类型。 所以现在的代码是: Type func = typeof(Func); Type generic = func.MakeGenericType(typeof(T), get.ReturnType); var result = Delegate.CreateDelegate(generic, get) 现在的问题是创建的generic委托实例所以我必须使用DynamicInvoke ,这与使用纯reflection来读取字段一样慢。 所以我的问题是为什么第一段代码失败了值类型。 根据MSDN,它应该像它说的那样工作 如果方法的返回类型比委托的返回类型更具限制性,则委托的返回类型与方法的返回类型兼容 以及如何在第二个片段中执行委托,以便它比reflection更快。 谢谢。

如何使用reflection调用ref / out参数的方法

想象一下,我有以下课程: class Cow { public static bool TryParse(string s, out Cow cow) { … } } 是否可以通过reflection调用TryParse ? 我知道基础知识: var type = typeof(Cow); var tryParse = type.GetMethod(“TryParse”); var toParse = “…”; var result = (bool)tryParse.Invoke(null, /* what are the args? */);

如何从EventInfo获取委托对象?

我需要从当前类中获取所有事件,并找出订阅它的方法。 在这里,我得到了一些关于如何做到这一点的答案 ,但我不知道如何获得delegate ,而我所拥有的只是EventInfo 。 var events = GetType().GetEvents(); foreach (var e in events) { Delegate d = e./*GetDelegateFromThisEventInfo()*/; var methods = d.GetInvocationList(); } 是否可以通过EventInfo获得委托? 怎么样?

递归获取对象的属性和子属性

好吧,所以起初我觉得这很容易,也许就是这样,我太累了 – 但这就是我想做的事情。 说我有以下对象: public class Container { public string Name { get; set; } public List Addresses { get; set; } } public class Address { public string AddressLine1 { get; set; } public string AddressLine2 { get; set; } public List Telephones { get; set; } } public class Telephone { public string […]

缓存reflection结果(类属性)

考虑到不应该重新评估相当静态的数据而是缓存,我想知道是否可以使用Reflection来获取类属性一次,然后缓存它们以便我可以动态评估对象属性和读取/赋值,但不是每次我这样做都会有reflection开销。 这可能吗(示例代码?)? 为了澄清一点,让我说我有这个课程: public class Cloud { Boolean IsWhite; } 而我正在尝试制作一个方法,允许我做这样的事情(伪代码): Update(myCloudInstance, new {IsWhite, true}); 如果现在更新已经知道云的属性(typeof(myCloudInstance)),则应首先检查缓存,然后使用缓存信息将属性“IsWhite”赋值为“true”,而不是再次执行Reflection。 关于如何做到这一点的任何想法?