Tag: reflection

使用在运行时确定的类型参数调用generics函数

我有一个问题涉及使用在运行时已知的类型参数调用类的generics方法。 具体来说,代码如下所示: FieldInfo[] dataFields = this.GetType().GetFields( BindingFlags.Public | BindingFlags.Instance ); // data is just a byte array used internally in DataStream DataStream ds = new DataStream( data ); foreach ( FieldInfo field in dataFields ) { Type fieldType = field.FieldType; // I want to call this method and pass in the type parameter specified by […]

在reflection中循环模型属性,然后使用Html帮助程序显示。 如何获得具体房产?

我们有一个MVC4 ASP.Net站点,我们试图使用reflection来循环模型的属性,并使用Html助手显示名称/值/和其他信息。 我们有一个自定义的Html Helper,我们从下面的方法传递参数。 @foreach (PropertyInfo prop in Model.GetType().GetProperties()) { Html.LabelFor( ?? Any ideas ?? ) @SuperEditorFor.ReflectiveEditorFor(prop, Model) @Html.ValidationMessageFor(model => model.GetType().GetProperty(prop.Name)) } 我们已经尝试在ValidationMessageFor中输入“property”(quote),但正如我们所怀疑的那样,它需要实际的具体属性,而不是reflection的propertyInfo对象。 有谁知道这是否可能? 有没有人试过这样做呢?

XmlSerializer,“指定”后缀和IReflect

我发现如果可序列化的Field / Property有一个Boolean类型的相应字段,其字段名称为“Specified”后缀,则XmlSerializer有条件地从序列化过程中排除该字段/属性 。 太好了! 所以,我想避免这些字段的定义,并在运行时动态添加它们…… 阅读本文 ,我发现了一个有趣的界面IReflect ,我可以用它来“模拟”XmlSerializer实例用来排除某些字段的动态字段。 这会有用吗?

使用reflection和枚举来进行MVC应用程序访问的逻辑控制是否安全?

试图管理对网站的访问我创建了一些必要的实体 目标是为我的MVC应用程序的某些控制器的操作方法使用自定义权限属性。 [Permissions(PermissionType.SomePermissionName, CrudType.CanDelete)] public ActionResult SomeAction() { } 对于这个操作,我有两个枚举 [Flags] public enum CrudType { CanCreate = 0x1, CanRead = 0x2, CanUpdate = 0x4, CanDelete = 0x8, } [Flags] public enum PermissionType { SomePermissionName = 0x1, //… } 现在我想要下面的方法来检查权限 public static bool CanAccess(RolePermissions rp, CrudType crudType) { var pInfo = rp.GetType().GetProperties(); var res = pInfo.FirstOrDefault(x […]

相同的变量名称 – 2个不同的类 – 如何将值从一个复制到另一个 – reflection – C#

不使用AutoMapper …(因为当他们看到依赖项时,负责这个项目的人会打砖块) 我有一个类(A类),但有很多属性。 我有另一个类(B类)具有相同的属性(相同的名称和类型)。 B类也可能有其他无关的变量。 是否有一些简单的reflection代码可以将值从A类复制到B类? 越简越好。

如何确定属性是否是C#中的用户定义类型?

如何确定属性是否是用户定义的类型? 我尝试使用IsClass,如下所示,但它的值对于String属性是真的(谁知道还有什么)。 foreach (var property in type.GetProperties()) { if (property.PropertyType.IsClass) { // do something with property } } *更新以获得更清晰* 我试图遍历给定类型的定义,如果在程序集中定义了给定类型或其任何公共属性,我正在搜索嵌入式JavaScript文档。 我只是不想在本机.NET类型上浪费处理资源和时间。

如何使用Reflection或其他准确方法获取控制器内的当前ASP.NET核心控制器方法名称

我想获取我的ASP.NET Core控制器的当前方法名称 我试过通过reflection获取方法名称: [HttpGet] public async Task CreateProcess(int catId) { string methodName = System.Reflection.MethodBase.GetCurrentMethod().Name; 但这给了我一个MoveNext的值,而不是CreateProcess 请注意我不想使用ViewContext string methodName = ActionContext.RouteData.Values[“action”].ToString(); 因为我通过启动设置小写我的URL。上面将得到createprocess而不是CreateProcess 我最好想要一个简单的单行而不是多行扩展方法。

PropertyInfo SetValue和nulls

如果我有类似的东西: object value = null; Foo foo = new Foo(); PropertyInfo property = Foo.GetProperties().Single(p => p.Name == “IntProperty”); property.SetValue(foo, value, null); 然后将foo.IntProperty设置为0 ,即使value = null 。 它看起来像IntProperty = default(typeof(int)) 。 如果IntProperty不是“可空”类型( Nullable或引用),我想抛出InvalidCastException 。 我正在使用Reflection,所以我不提前知道类型。 我该怎么做呢?

如何在C#中为运行时加载程序集及其所有依赖项以进行reflection?

我正在为自己编写一个实用程序,部分原因是为了学习C#Reflection而且部分是因为我实际上想要自己使用的结果工具。 我所追求的是基本上将应用程序指向程序集并选择一个给定的类,从中选择应作为字段包含在导出的HTML表单中的属性。 然后,该表单将在我的ASP.NET MVC应用程序中用作View的开头。 因为我正在将Subsonic对象用于我想要使用的应用程序,所以这应该是合理的,我想通过想要根据数据类型包含不同输出HTML之类的东西,Reflection就是完成这项工作的方法。 然而,我正在寻找的东西似乎难以捉摸。 我正在尝试将通过OpenFileDialog选择的DLL / EXE作为起点并加载它: String FilePath = Path.GetDirectoryName(FileName); System.Reflection.Assembly o = System.Reflection.Assembly.LoadFile(FileName); 这工作正常,但由于Subsonic生成的对象实际上充满了在Subsonic.dll等中定义的对象类型,因此不会加载这些依赖对象。 输入: AssemblyName[] ReferencedAssemblies = o.GetReferencedAssemblies(); 那也包含了我所期望的。 但是,我想弄清楚的是如何加载这些程序集,以便我挖掘到我的对象将正常工作。 我理解,如果这些程序集在GAC或正在运行的可执行文件的目录中,我可以按名称加载它们,但对于这个用例而言可能不是这种情况,这是我的主要用例。 因此,它归结为如何加载给定的程序集及其所有任意程序集以文件名开头,并生成一个完全reflection可浏览的类型,属性,方法等树。 我知道像Reflector这样的工具可以做到这一点,我找不到获取它的语法。

Lazy 实现和.NETgenerics

我一直在寻找延迟初始化的方法,并找到了包含在.NET 4中的Lazy 。 我正在考虑使用自己的Lazy for .NET 3.5实现(使用更简单的multithreading策略),我遇到了以下问题: Lazy基本上有两种类型的构造函数: class Lazy { public Lazy(){…} // ctor #1 它使用T的默认构造函数来创建T的实例,和 public Lazy(Func func){…} // ctor #2 这让调用者决定如何创建T的实例。 现在问题在于: 如果我想要第一个ctor的编译时检查,我将添加一个限制 class Lazy where T: new() {…} 在class级。 这将允许我使用new T()来创建一个实例; 但是这个限制对于第二个ctor来说不是必需的,更糟糕​​的是,它也限制了我可以使用的类型(对于那些有默认ctor的人) 如果我想能够使用任何类型的第二个ctor,我将不会设置任何限制,并在第一个ctor将使用reflection,以确保T确实有一个默认的ctor。 但是,这种方法缺少编译时检查,如果第一个ctor使用了错误的类型,则只会抛出运行时exception。 我的问题是:我可以充分利用这两个世界吗? 理想情况下,我想对ctor#1的每次使用进行编译时检查,但同时能够将ctor#2用于没有默认ctor的类型。 Microsoft实现如何执行此操作? (我不能轻易访问.NET 4源代码或dll)。 编辑:(在“reflection器”MS组件之后) 我检查了参考实现,它没有进行编译时检查。 它使用reflection作为’默认ctor’的情况,当然如果事情变坏则伴随着运行时exception。