当前位置: 首页 > 编程语言 > C#

从StackFrame获取类型T,分享

时间:2023-04-10 23:25:03 C#

从StackFrame获取TypeT。目标是根据调用我的方法的类型创建一个通用实例。问题是,当从泛型调用时,StackFrame似乎只包含开放定义类型参数,而不包含封闭定义类型参数。如何从StackFrame获取类型参数?类似于这个问题。我想我的情况有所不同,因为Log.Debug是从封闭方法调用的。如果StackFrame不是正确的方法,除了IoC之外还有什么建议吗?此代码用于填充对我的Unity容器的引用不可用的情况。使用系统;使用System.Reflection;namespaceReflectionTest{publicclassLogger{privatereadonlystringloggerName;protectedLogger(stringloggerName){this.loggerName=loggerName;}publicvoidDebug(stringmessage){Console.WriteLine(string.Format("{0}-{1}",loggerName,message));}}publicclassLogger:Logger{publicLogger():base(typeof(T).FullName){}}publicstaticclassLog{publicstaticvoidDebug(stringmessage){//确定调用函数,创建一个Logger为了它。System.Diagnostics.StackFrameframe=newSystem.Diagnostics.StackFrame(1);MethodBase方法=frame.GetMethod();///当方法来自泛型类时,///method.ReflectedType定义是开放的:Type.ContainsGenericParameters是true///如何获取method.ReflectedType的泛型参数///Activator.CreateInstance()不会扔?输入logType=typeof(Logger);构造类型=logType.MakeGenericType(newType[]{方法.ReflectedType});记录器logger=(Logger)Activator.CreateInstance(constructed);记录器。调试(消息);}}publicclassMyBase{publicvoidRun(){Log.Debug("RunGeneric");//抛出Activator.CreateInstance()}}classProgram{staticvoidWorks(){Log.Debug("RunNonGeneric");//有效}staticvoidDoesNotWork(){MyBaseb=newMyBase();b.运行();}staticvoidMain(string[]args){Works();不工作();}}}栈帧是不可靠的,它只是为了调试目的,你不能假设有任何有用的东西。这就是为什么它位于“诊断”命名空间中的原因。但更一般地说,您的问题表明对堆栈框架告诉您的内容存在根本性的误解。你说目标是根据调用我的方法的类型创建一个通用实例。栈帧实际上并没有告诉你是谁调用了你的方法。栈帧告诉你控制将返回到哪里。栈帧是延续的具体化。谁调用该方法以及控件将返回的位置几乎总是相同的事实是您混淆的根源,但我向您保证它们不必相同。特别是,预览版中即将推出的“async/await”功能证明了这一点。从await恢复的代码在堆栈帧上不知道最初调用它的人;该信息将永远丢失。由于下一个要运行的代码在逻辑上与最初调用该方法的代码是分开的,因此堆栈帧不包含此信息。我们不需要像那样充满异国情调。例如,假设方法M包含对方法N的调用,N调用方法O。如果jitter选择将N内联在M内部,那么从O观察到的栈帧将不包含N。栈帧告诉你当前方法控制在哪里返回时恢复。当O返回时,控制在M内恢复,而不是在N内,因此堆栈帧不包含有关N的任何信息。以上就是C#学习教程:从StackFrame获取TypeT分享的所有内容。如果对你有用,需要进一步了解C#学习教程,希望大家多多关注。本文收集自网络,不代表立场。如涉及侵权请点击右侧联系管理员删除。如需转载请注明出处: