Tag: reflection

Type.IsGenericTypeDefinition和Type.ContainsGenericParameters之间的区别

System.Type类型包含属性IsGenericTypeDefinition和ContainsGenericParameters 。 阅读完MSDN文档后,我得出结论,两个属性都存在,以检查类型是开放类型还是封闭类型。 但是,我没有看到两者之间的区别,以及何时想要使用另一个。

GetPropertyreflection导致新属性中出现“模糊匹配”

我如何获得我的财产? 目前Ambiguous match found的Ambiguous match found发生错误,请参阅代码中的注释行。 public class MyBaseEntity { public MyBaseEntity MyEntity { get; set; } } public class MyDerivedEntity : MyBaseEntity { public new MyDerivedEntity MyEntity { get; set; } } private static void Main(string[] args) { MyDerivedEntity myDE = new MyDerivedEntity(); PropertyInfo propInfoSrcObj = myDE.GetType().GetProperty(“MyEntity”); //– ERROR: Ambiguous match found }

将c#by-reference类型转换为匹配的非引用类型

我使用reflection检查C#方法的参数。 该方法有一些out参数,对于这些参数我得到了类型,它们具有IsByRef = true。 例如,如果参数声明为“out string xxx”,则参数的类型为System.String&。 有没有办法将System.String转换回System.String? 解决方案当然不仅适用于System.String,也适用于任何类型。

用Dapper调用自定义构造函数?

我正在尝试使用Dapper与ASP.NET SQL Membership Provider表进行交互。 我包装了SqlMembershipProvider类,并添加了一个额外的方法来获取MembershipUsers给出一些与我自己的一些自定义表相关的标准。 使用Dapper查询数据时,似乎Dapper首先使用无参数构造函数实例化该类,然后将返回的列“映射”到对象的属性中。 但是,MembershipUser类上的UserName属性没有setter。 从Dapper SqlMapper.cs中的第1417行开始, GetSettableProps()方法只获取可设置的属性。 我试图做一个MultiMap查询来调用构造函数,但问题是传递给查询的对象已经缺少UserName。 我猜我可以修改GetSettableProps()方法,但我不确定它是否可行,或者它是否会影响我现有的代码。 反正我有没有调用MembershipUser类有的自定义构造函数? 或者我是否可以对Dapper做出合理的改变以支持我的情况? ** 更新 ** Marc使用非generics/动态Query()方法的答案是正确的,但对后人来说,这是我在Dapper中引用的方法: static List GetSettableProps(Type t) { return t .GetProperties(BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance) .Select(p => new PropInfo { Name = p.Name, Setter = p.DeclaringType == t ? p.GetSetMethod(true) : p.DeclaringType.GetProperty(p.Name).GetSetMethod(true), Type = p.PropertyType }) .Where(info => info.Setter != […]

如何使用Reflection调用自定义运算符

在我的小项目中,我使用System.Reflection类来生成可执行代码。 我需要调用自定义类型的+运算符。 有谁知道如何使用C#reflection调用自定义类的自定义运算符?

如何在静态方法中获取当前类的名称?

通常我可以调用this.GetType(),但我无法在静态方法中访问它。 我们怎么检查呢?

如何使用reflection来获取显式实现接口的属性?

更具体地说,如果我有: public class TempClass : TempInterface { int TempInterface.TempProperty { get; set; } int TempInterface.TempProperty2 { get; set; } public int TempProperty { get; set; } } public interface TempInterface { int TempProperty { get; set; } int TempProperty2 { get; set; } } 如何使用reflection来获取显式实现TempInterface的属性的所有propertyInfos? 谢谢。

.NETreflection – 如何从ParameterInfo中获取“真实”类型

我正在尝试validation参数是否为out参数并扩展接口(ICollection)。 reflectionapi似乎不想给我参数的“真实”类型,只有最后一个“&”的参数不能在IsAssignableFrom语句中正确评估。 我写了一些有效的c#代码,但似乎应该有更好的方法来做到这一点。 bool isCachedArg(ParameterInfo pInfo) { if (!pInfo.IsOut) return false; string typeName = pInfo.ParameterType.FullName; string nameNoAmpersand = typeName.Substring(0, typeName.Length – 1); Type realType = Type.GetType(nameNoAmpersand); if (!typeof(ICollection).IsAssignableFrom(realType)) return false; return true; } 有没有办法获得realType而无需从其字符串名称重新加载Type? 我还在使用.NET 2.1。 谢谢,兰迪

只能在Type.IsGenericParameter为true的Type上调用方法

我在一个例程上得到这个错误,该例程使用reflection来转储一些对象属性,类似下面的代码。 MemberInfo[] members = obj.GetType().GetMembers(BindingFlags.Public | BindingFlags.Instance) ; foreach (MemberInfo m in members) { PropertyInfo p = m as PropertyInfo; if (p != null) { object po = p.GetValue(obj, null); … } } 实际错误是“调用目标已抛出exception”,内部exception为“只能在Type.IsGenericParameter为true的Type上调用Method”。 在调试器obj的这个阶段出现 {Name = “SqlConnection” FullName = “System.Data.SqlClient.SqlConnection”} 使用System.RuntimeType类型 方法m是{System.Reflection.MethodBase DeclaringMethod} 请注意,obj的类型为System.RuntimeType,成员包含188个项目,而简单的typeof(System.Data.SqlClient.SqlConnection).GetMembers(System.Reflection.BindingFlags.Public | System.Reflection.BindingFlags.Instance)仅返回65。 我尝试在obj和p.PropertyType上检查isGenericParameter,但对于大多数属性(包括p.GetValue工作的那些属性),这似乎都是错误的。 那么究竟什么是“Type.IsGenericParameter为真的类型”,更重要的是如何在没有try / catch的情况下避免这个错误?

将Func 强制转换为Func 的更快方法?

有没有更快的方法将Fun为Func public static class StaticAccessors { public static Func TypedGetPropertyFn(PropertyInfo pi) { var mi = pi.GetGetMethod(); return (Func)Delegate.CreateDelegate(typeof(Func), mi); } public static Func ValueUnTypedGetPropertyTypeFn(PropertyInfo pi) { var mi = typeof(StaticAccessors).GetMethod(“TypedGetPropertyFn”); var genericMi = mi.MakeGenericMethod(pi.PropertyType); var typedGetPropertyFn = (Delegate)genericMi.Invoke(null, new[] { pi }); //slow: lambda includes a reflection call return x => typedGetPropertyFn.Method.Invoke(x, new object[] { […]