Tag: reflection

现在有办法将TVP传递给.Net Core上的小巧玲珑吗?

我正在使用.net核心和dapper,第一个没有DataTables,第二个使用它们用于TVP。 我试图将List转换为List ,使用此列表创建一个SqlParameter然后将其转换为DynamicParameter但遗憾的是我得到了: The member of type Microsoft.SqlServer.Server.SqlDataRecord cannot be used as a parameter value UPDATE 在使用IDynamicParameters玩了一下之后,我就开始了。 IEnumerable扩展方法 public static DynamicWrapper toTVP(this IEnumerable enumerable, string tableName, string typeName) { List records = new List(); var properties = typeof(T).GetProperties().Where(p => Mapper.TypeToSQLMap.ContainsKey(p.PropertyType)); var definitions = properties.Select(p => Mapper.TypeToMetaData(p.Name, p.PropertyType)).ToArray(); foreach (var item in enumerable) { var values […]

使用reflection检查方法是否为“扩展方法”

作为我的应用程序的一部分,我有一个接收MethodInfo并需要对其执行特定操作的函数,具体取决于该方法是否为“扩展方法”。 我检查了MethodInfo类,我找不到任何显示该方法是扩展名的IsExtension属性或标志。 有谁知道如何从方法的MethodInfo中找到它?

C#Reflection:使用字符串类名实例化对象

我的情况是下一个:我正在使用Visual C#2010 express开发Windows Forms应用程序。 当用户登录时,使用从数据库表加载的选项来构建menustrip。 在该表中,我保存id,选项名称和表单名称。 所以,假设在我的项目中我有一个名为Contabilidad的Form,它有一个主类的Contabilidad.cs,所以如果我想创建一个新表单并显示它我这样做: Contabilidad frmConta = new Contabilidad(); frmConta.Show(); 但在这种情况下,因为菜单选项存储在数据库中,所以在数据库中我只有字符串“Contabilidad”。 因此,我想使用C#reflection来创建一个Contabilidad实例或任何其他只有字符串格式的类名的表单。 首先我试过这个: Form frmConta= (Form)Activator.CreateInstance(null, “Contabilidad”).Unwrap(); 因为我在StackOverflow问题中读到如果我使用null我指的是当前程序集(我的表单都在同一个项目中),但我收到此消息: Could not load type ‘Contabilidad’ from assembly ‘AccountingSA, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null’. 类定义是下一个: namespace AccountingSA { public partial class Contabilidad : Form { public Contabilidad() { InitializeComponent(); } … 我试过这个: Assembly assembly = Assembly.Load(“AccountingSA”); Type […]

是否有可能加速这种方法?

我有一个方法,通过7,753+对象使用循环并获取每个对象的每个属性的值。 每个对象有14属性。 private void InitializeData(IList objects, PropertyInfo[] props, List dataPs, List<Dictionary> tod) { foreach (var item in objects) { var kvp = new Dictionary(); foreach (var p in props) { var dataPs = dataPs.FirstOrDefault(x => x.Name == p.Name); object returnData; if (dataPoint != null) { int maxLength = (dataP.MaxLength == null) ? 0 : (int) […]

C#“是”运算符 – 是reflection吗?

一位同事今天问我一个有趣的问题 – C#关键字/运营商“是否被认为是反思? object tmp = “a string”; if(tmp is String) { } 这个操作符是如何在幕后实现的? 它需要反思还是反省? 或者由于语言的强类型性质,对象的类型是否可以作为内存中对象的顶级属性立即访问? MSDN声明: 请注意,is运算符仅考虑引用转换,装箱转换和拆箱转换。 is运算符不考虑其他转换,例如用户定义的转换。 考虑盒装和非盒装转换的能力似乎意味着我某种内省。

通用Func 的运行时创建

我需要实现这个方法: object GetFactory(Type type); 此方法需要返回一个Func ,其中typeparam’T’是’type’。 所以,我的问题是我不知道如何使用reflection在运行时创建一个Func 。 Activator.CreateInstance不起作用,因为委托上没有构造函数。 有任何想法吗?

通过提供类名作为字符串来获取引用程序集的类型?

这些是类似的问题: 操作方法:在运行时使用Silverlight中的字符串从引用的程序集加载类型,引用的程序 集中的类上的GetType失败,但两个答案都不起作用。 我有一个MVC项目,它从包含普通类型作为字符串的数据库中提取数据。 这些类型位于引用的程序集中,而不是MVC项目中。 例如,假设我的Referenced程序集名称是MyFramework ,普通类型名称为Car ,完整类型名称可以是MyFramework.Cars.Car或MyFramework.Vehicles.Cars.Car或其他一些变体。 我只有引用的程序集名称和普通的类名称作为字符串。 无论完整的类型名称如何,我如何获得类型? 最后,我可以在引用的程序集中编写一个函数来调用GetType()并在MvC项目中使用它,这样我可以放弃包括程序集名称吗? 我想删除已知的程序集名称,所以我想我可以在引用的程序集中编写一个Util,如: namespace MyFramework //the referenced assembly { public static class TypeUtil { public static Type GetFrameworkType(string typeName) { return Type.GetType(typeName); } } } 然后在我的MVC项目中,我可以调用它而不需要将程序集作为字符串名称。 这是可能的还是我总是需要汇编名称?

使用out参数反映静态重载方法

我有一些问题,通过reflection调用带有out参数的重载静态方法,并会欣赏一些指针。 我想要动态创建类似System.Int32或System.Decimal的类型,然后在其上调用静态TryParse(string, out x)方法。 以下代码有两个问题: t.GetMethod(“TryParse”, new Type[] { typeof(string), t } )无法返回我期望的MethodInfo mi.Invoke(null, new object[] { value.ToString(), concreteInstance })似乎成功但没有将out param concreteInstance设置为已解析的值 交织到此函数中,您可以看到一些临时代码,演示如果type参数设置为System.Decimal会发生什么。 public static object Cast(object value, string type) { Type t = Type.GetType(type); if (t != null) { object concreteInstance = Activator.CreateInstance(t); decimal tempInstance = 0; List l = new List(t.GetMethods(BindingFlags.Static | BindingFlags.Public)); […]

为属性setter或getter创建一个高性能的开放委托

开放委托是没有目标的实例方法的委托。 要调用它,您需要提供目标作为其第一个参数。 它们是优化代码的一种聪明方法,否则会使用reflection并且性能较差。 有关开放代表的介绍,请参阅此内容 。 你在实践中使用它的方法是使用昂贵的reflection代码来构建这些开放的委托,但是你可以像一个简单的委托调用那样非常便宜地调用它们。 我正在尝试编写将任意PropertyInfo转换为其setter的委托的代码。 到目前为止,我想出了这个: using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Reflection; namespace Test { class TestClass { static Action MakeSetterDelegate(PropertyInfo property) { MethodInfo setMethod = property.GetSetMethod(); if (setMethod != null && setMethod.GetParameters().Length == 1) //skips over nasty index properties { //To be able to bind to the delegate […]

什么是(fnptr)*类型以及如何创建它?

以下IL代码创建名为(fnptr)*的Type实例(标记0x2000000 – 无效,模块mscorlib.dll)。 ldtoken method void* ()* call class [mscorlib]System.Type [mscorlib]System.Type::GetTypeFromHandle(valuetype [mscorlib]System.RuntimeTypeHandle) 这种类型的目的是什么? 是否可以在C#中创建此类型实例而无需编写任何IL代码,也许可以使用reflection? 令牌上的Module.ResolveType抛出ArgumentOutOfRangeException 。 编辑: 很明显, (fnptr)类型是IL方法指针类型的内部CLR类型表示,但是当删除最后一个* ,它只返回IntPtr 。 编辑#2: (fnptr)来自一个可以在SSCLI typestring.cpp中看到的函数 : // …or function pointer else if (ty.IsFnPtrType()) { // Don’t attempt to format this currently, it may trigger GC due to fixups. tnb.AddName(L”(fnptr)”); } 为什么基本的fnptr返回IntPtr可以在typehandle.cpp中看到: OBJECTREF TypeHandle::GetManagedClassObject() const { […] […]