Tag: reflection

为什么通用类型定义实现的接口会丢失类型信息?

例如,如果您运行以下代码… Type IListType = new List().GetType() .GetInterface(“IList`1”) .GetGenericTypeDefinition(); …并且您观察IListType变量,您会发现整个Type实例具有FullName等所有可用属性。 但是当你运行代码时会发生什么? Type IListType2 = typeof(List).GetInterface(“IList`1”) 现在,来自generics类型定义的IListType与第一个代码示例不同:大多数Type属性将返回null。 这个问题的主要问题是IListType == IListType2不等于它们是相同的类型。 这是怎么回事? 这太丑了…… 现在看看如果调用IListType2.GetGenericTypeDefinition()会发生什么……它恢复了类型信息! .NET Framework开发团队成员可以解释为什么一个奇怪地丢失其元数据的已经generics的类型定义为什么IsGenericTypeDefinition属性设置为false而它仍然是generics类型定义,最后,如果你调用GetGenericTypeDefinition()在它上面,你恢复了类型信息。 这很奇怪… 以下等式将true : Type IListType = new List().GetType() .GetInterface(“IList`1”) .GetGenericTypeDefinition(); // Got interface is “like a generic type definition” since it has // no type for T generic parameter, and once you […]

在运行时修改类属性

我不确定我是否有可能看到: 在运行时更改Attribute的参数。 我的情况非常相似,但我试图在运行时更改类的属性: [Category(“Change me”)] public class Classic { public string Name { get; set; } } 其中一个答案是: Dim prop As PropertyDescriptor = TypeDescriptor .GetProperties(GetType(UserInfo))(“Age”) Dim att As CategoryAttribute = DirectCast( prop.Attributes(GetType(CategoryAttribute)), CategoryAttribute) Dim cat As FieldInfo = att.GetType.GetField( “categoryValue”, BindingFlags.NonPublic Or BindingFlags.Instance) cat.SetValue(att, “A better description”) 更改为更易阅读的格式,感谢Marc Gravell: TypeDescriptor.AddAttributes(table, new Category{ Name = “Changed” […]

在类型上查找立即实现的接口

在以下场景中调用typeof(Bar).GetInterfaces()时,该方法返回IFoo和IBar。 interface IFoo {} interface IBar : IFoo {} class Bar : IBar {} 有没有办法可以在Bar上找到直接界面(IBar)?

创建类型的默认实例

什么是reflection等价物: default(object); //null 当我直到运行时才有类型,例如 public void Method(Type type) { var instance = type.CreateDefault(); //no such method exists, but I expect there is a way of doing this? }

如何确定.NET Type是否是自定义结构?

如何编写一个简单的方法,检查具体类型是否是自定义结构(使用public struct { };创建)。 检查Type.IsValueType是不够的,因为它也适用于int , long等,并添加一个检查!IsPrimitiveType不会排除decimal , DateTime和其他一些值类型。 我知道大多数内置值类型实际上是“结构”,但我只想检查“自定义结构” 这些问题大致相同但没有我需要的答案: #1 #2 #3 编辑:从提到的答案“检查’系统’前缀”是最稳定的(虽然它仍然是一个黑客)。 我最终决定创建一个必须用它来装饰结构的属性,以便框架将其作为自定义结构来选择。 (我想的另一个选择是创建一个空接口,让struct实现那个空接口,但属性方式似乎更优雅) 这是我原来的自定义结构检查器,如果有人感兴趣: type.IsValueType && !type.IsPrimitive && !type.Namespace.StartsWith(“System”) && !type.IsEnum

在匿名方法中使用MethodInfo.GetCurrentMethod()

public static void Main(string[] args) { Action a = () => Console.WriteLine(MethodInfo.GetCurrentMethod().Name); a(); } 此代码将返回一个模糊的字符串,如下所示: b__0 。 有没有办法忽略匿名方法并获得更可读的方法名称?

当我在我的方法中传递generics时,如何获取类名?

我的方法看起来像: public string DoObjectProperties(T obj, string text) { } 现在从方法中,我需要获取我传递给方法的’obj’参数的类名的字符串值。 因此,如果我传入User对象,我需要文本’user’。 获取我正在使用的属性: typeof(T).GetProperties() 我怎样才能获得课程名称?

如何将C#对象拆分为动态类型

我正在尝试做这样的事情: void someMethod(TypeA object) { … } void someMethod(TypeB object) { … } object getObject() { if (…) return new TypeA(); else return new TypeB(); } object obj = getObject(); (obj.GetType()) obj; // won’t compile someMethod(obj); 显然我在这里很困惑。 我知道我可以通过写出条件陈述来完成这项工作 – if (obj.GetType() == typeof(TypeA)) obj = (TypeA)obj; else if (obj.GetType() == typeof(TypeB)) obj = (TypeB)obj; – […]

在动态事件处理程序中引用’this’

在我的’myClass’类中,我使用Reflection.Emit为myClass类的一个成员动态编写一个事件处理程序。 我成功完成了这个。 现在,我想修改事件处理程序以调用myClass类中的一个实例方法。 但是,我无法弄清楚如何使用Reflection.Emit将对’this’的引用推送到MSIL堆栈。 在事件处理程序中,Ldarg_0不是对“this”的引用,而是事件处理程序的第一个参数。 有没有人知道如何在堆栈上推送’this’的引用,以便我可以调用实例方法。 例如,这就是我希望c#代码看起来像: public class myClass { private myObj1 obj1; public myClass() { this.init(); } private void init() { obj1.myEvent += new myEvent_EventHandler(theHandler); } private void theHandler(myObj2 obj2, myObj3 obj3) { // this is the part I’m having trouble with this.myFunction(obj2); } private void myFunction(myObj2 obj2) { // irrelevant } } […]

加载同一程序集的不同版本

使用reflection,我需要加载同一组件的2个不同版本。 我可以在同一个进程中在2个不同的AppDomain中加载2个版本吗? 我需要从旧版本的应用程序到新版本进行一些数据迁移。 如果可能,请告诉我,或者我应该使用2个单独的流程。