当前位置:首页>java>告别反射地狱!C#动态编程让你的代码优雅起飞

告别反射地狱!C#动态编程让你的代码优雅起飞

  • 2026-02-07 06:53:10
告别反射地狱!C#动态编程让你的代码优雅起飞

你是否曾经为了处理未知结构的JSON而写了一大堆反射代码?是否为了实现灵活的API而让代码变得臃肿不堪?今天我们来聊聊C#中一个被严重低估的特性——动态编程(Dynamic Programming)

掌握System.Dynamic命名空间,你将告别繁琐的反射操作,让代码变得更加优雅和高效。本文将通过5个实战场景,带你深入理解并应用C#的动态特性

🎯 为什么需要动态编程?

在实际开发中,我们经常遇到这些痛点:

  • • JSON数据结构不固定:接口返回的数据格式经常变化
  • • 配置文件灵活性不够:需要支持动态添加属性
  • • 插件系统扩展困难:第三方组件接口不统一
  • • 反射性能问题:大量使用反射导致性能下降

💡 解决方案:System.Dynamic全家桶

🚀 方案一:ExpandoObject - 动态对象的最佳选择

ExpandoObject是动态编程的明星类,它允许我们在运行时动态添加和删除成员。这是个好东西,还没有这个出来前处理这个挺麻烦的。

// 使用ExpandoObject的优雅方式publicclassDynamicApproach{publicvoidProcessJson(string json)    {dynamic obj = JsonSerializer.Deserialize<ExpandoObject>(json);// 直接访问属性,如同静态类型一样自然        Console.WriteLine($"姓名: {obj.name}");        Console.WriteLine($"年龄: {obj.age}");// 动态添加新属性        obj.processTime = DateTime.Now;        obj.status = "已处理";    }}

💰 实际应用场景:

  • • API响应处理
  • • 配置文件读取
  • • 临时数据容器

⚠️ 坑点提醒:

  • • 没有编译时类型检查,拼写错误只能在运行时发现
  • • 性能略低于静态类型

🔧 方案二:DynamicObject - 自定义动态行为

当ExpandoObject无法满足复杂需求时,继承DynamicObject可以实现完全自定义的动态行为。

using System.Dynamic;using System.Net.Http.Json;using System.Text.Json;using System.Text.Json.Serialization;namespaceAppDynamicProgramming{internalclassProgram    {staticvoidMain(string[] args)        {dynamic config = new SmartConfig();// 动态设置属性            config.DatabaseUrl = "localhost:1433";            config.MaxConnections = 100;            config.EnableCache = true;// 动态调用方法var updateTime = config.GetUpdateTime("DatabaseUrl");var allProps = config.GetAllProperties();            Console.WriteLine($"数据库连接串更新时间: {updateTime}");            Console.WriteLine($"所有配置项: {string.Join(", ", allProps)}");        }    }publicclassSmartConfig : DynamicObject    {private Dictionary<stringobject> _properties = new Dictionary<stringobject>();private Dictionary<string, DateTime> _updateTimes = new Dictionary<string, DateTime>();// 重写获取成员的行为publicoverrideboolTryGetMember(GetMemberBinder binder, outobject result)        {string propertyName = binder.Name;// 添加日志记录            Console.WriteLine($"访问属性: {propertyName}");return _properties.TryGetValue(propertyName, out result);        }// 重写设置成员的行为publicoverrideboolTrySetMember(SetMemberBinder binder, objectvalue)        {string propertyName = binder.Name;// 自动记录更新时间            _updateTimes[propertyName] = DateTime.Now;            _properties[propertyName] = value;            Console.WriteLine($"设置属性: {propertyName} = {value}");returntrue;        }// 自定义方法调用publicoverrideboolTryInvokeMember(InvokeMemberBinder binder, object[] argsoutobject result)        {            result = null;switch (binder.Name)            {case"GetUpdateTime":if (args.Length == 1 && args[0isstring propName)                    {                        result = _updateTimes.TryGetValue(propName, out DateTime time) ? time : (DateTime?)null;returntrue;                    }break;case"GetAllProperties":                    result = _properties.Keys.ToList();returntrue;            }returnfalse;        }    }}

💰 实际应用场景:

  • • 智能配置系统
  • • ORM框架
  • • 插件接口适配器

🌟 方案三:dynamic关键字 - 延迟绑定的魅力

dynamic关键字让我们可以绕过编译时类型检查,实现真正的鸭子类型编程。不过大量用这个dynamic效率肯定会低一些的,这块需要自己把握 。

publicclassDynamicDemo{// 通用的对象处理方法publicvoidProcessAnyObject(dynamic obj)    {// 不管obj是什么类型,只要有这些成员就能正常工作try        {            Console.WriteLine($"Name: {obj.Name}");            Console.WriteLine($"Value: {obj.Value}");            obj.Process();        }catch (RuntimeBinderException ex)        {            Console.WriteLine($"动态绑定失败: {ex.Message}");        }    }// COM组件交互的完美解决方案publicvoidWorkWithExcel()    {// 不需要引用Office PIA程序集        Type excelType = Type.GetTypeFromProgID("Excel.Application");dynamic excel = Activator.CreateInstance(excelType);        excel.Visible = true;dynamic workbook = excel.Workbooks.Add();dynamic worksheet = workbook.ActiveSheet;// 直接操作Excel对象,如同本地对象一样        worksheet.Cells[11].Value = "Hello Dynamic!";        worksheet.Cells[12].Value = DateTime.Now;// 清理资源        workbook.Close();        excel.Quit();    }}// 测试不同类型的对象publicclassPerson{publicstring Name { getset; } = "张三";publicint Value { getset; } = 100;publicvoidProcess() => Console.WriteLine("Person.Process() called");}publicclassProduct{publicstring Name { getset; } = "iPhone";publicdecimal Value { getset; } = 9999;publicvoidProcess() => Console.WriteLine("Product.Process() called");}

💰 实际应用场景:

  • • COM组件交互,当年调用excel,word这块还是挺费事的,每个要找接口,用dynamic确定简单不少,不过这些年基本没用过什么com组件了。
  • • 第三方库封装
  • • 动态代理实现

🎨 方案四:IDynamicMetaObjectProvider - 高级定制接口

对于需要完全控制动态行为的场景,实现IDynamicMetaObjectProvider接口提供了最大的灵活性。

using Microsoft.CSharp.RuntimeBinder;using System;using System.Dynamic;using System.Linq.Expressions;using System.Reflection;namespaceAppDynamicProgramming{publicclassPerson    {publicstring Name { getset; }publicint Value { getset; }    }internalclassProgram    {staticvoidMain(string[] args)        {var person = new Person { Name = "李四", Value = 200 };dynamic proxy = new FlexibleProxy(person);var flexProxy = (FlexibleProxy)proxy;  // 转换为具体类型            flexProxy.AddMethod("GetInfo"args => $"姓名: {person.Name}, 数值: {person.Value}");            flexProxy.AddMethod("Calculate"args => (int)args[0] + person.Value);            Console.WriteLine(proxy.GetInfo());            Console.WriteLine($"计算结果: {proxy.Calculate(50)}");        }    }publicclassFlexibleProxy : IDynamicMetaObjectProvider    {privatereadonlyobject _target;privatereadonly Dictionary<string, Func<object[], object>> _customMethods;publicFlexibleProxy(object target)        {            _target = target;            _customMethods = new Dictionary<string, Func<object[], object>>();        }// 添加自定义方法publicvoidAddMethod(string name, Func<object[], object> method)        {            _customMethods[name] = method;        }public DynamicMetaObject GetMetaObject(Expression parameter)        {returnnew FlexibleProxyMetaObject(parameter, this, _target);        }internalboolTryInvokeCustomMethod(string name, object[] argsoutobject result)        {if (_customMethods.TryGetValue(name, outvar method))            {                result = method(args);returntrue;            }            result = null;returnfalse;        }    }// 自定义MetaObject实现publicclassFlexibleProxyMetaObject : DynamicMetaObject    {privatereadonly FlexibleProxy _proxy;privatereadonlyobject _target;publicFlexibleProxyMetaObject(Expression expression, FlexibleProxy proxy, object target)            : base(expression, BindingRestrictions.Empty, proxy)        {            _proxy = proxy;            _target = target;        }publicoverride DynamicMetaObject BindInvokeMember(InvokeMemberBinder binder, DynamicMetaObject[] args)        {var resultVar = Expression.Variable(typeof(object), "result");var argExprs = args.Select(a => Expression.Convert(a.Expression, typeof(object)));var argsArray = Expression.NewArrayInit(typeof(object), argExprs);var tryCustomMethodCall = Expression.Call(                Expression.Constant(_proxy),typeof(FlexibleProxy).GetMethod("TryInvokeCustomMethod", BindingFlags.NonPublic | BindingFlags.Instance),                Expression.Constant(binder.Name),                argsArray,                resultVar            );var condition = Expression.Condition(                tryCustomMethodCall,                resultVar,                Expression.Throw(                    Expression.New(typeof(MissingMethodException).GetConstructor(new[] { typeof(string) }),                        Expression.Constant($"Method '{binder.Name}' not found.")                    ),typeof(object)                ),typeof(object)            );var block = Expression.Block(new[] { resultVar },                condition            );returnnew DynamicMetaObject(block, BindingRestrictions.GetTypeRestriction(Expression, LimitType));        }    }}

🛡️ 方案五:性能优化与最佳实践,你认为的可能不对?

publicclassPerformanceOptimizedDynamic{// 缓存CallSite以提高性能privatestaticreadonly ConcurrentDictionary<string, CallSite<Func<CallSite, objectobject>>>         GetMemberSites = new ConcurrentDictionary<string, CallSite<Func<CallSite, objectobject>>>();privatestaticreadonly ConcurrentDictionary<string, CallSite<Func<CallSite, objectobjectobject>>>         SetMemberSites = new ConcurrentDictionary<string, CallSite<Func<CallSite, objectobjectobject>>>();publicstaticobjectGetMember(object target, string memberName)    {var site = GetMemberSites.GetOrAdd(memberName, name =>            CallSite<Func<CallSite, objectobject>>.Create(                Binder.GetMember(CSharpBinderFlags.None, name, typeof(PerformanceOptimizedDynamic), new[] { CSharpArgumentInfo.Create(CSharpArgumentInfoFlags.None, null) })            )        );return site.Target(site, target);    }publicstaticvoidSetMember(object target, string memberName, objectvalue)    {var site = SetMemberSites.GetOrAdd(memberName, name =>            CallSite<Func<CallSite, objectobjectobject>>.Create(                Binder.SetMember(CSharpBinderFlags.None, name, typeof(PerformanceOptimizedDynamic),new[] {                     CSharpArgumentInfo.Create(CSharpArgumentInfoFlags.None, null),                    CSharpArgumentInfo.Create(CSharpArgumentInfoFlags.None, null)                })            )        );        site.Target(site, target, value);    }// 性能测试对比publicstaticvoidPerformanceTest()    {var obj = new ExpandoObject();dynamic dynamicObj = obj;// 预热for (int i = 0; i < 1000; i++)        {            dynamicObj.TestProperty = i;varvalue = dynamicObj.TestProperty;        }// 测试直接dynamic调用var sw1 = Stopwatch.StartNew();for (int i = 0; i < 100000; i++)        {            dynamicObj.TestProperty = i;varvalue = dynamicObj.TestProperty;        }        sw1.Stop();// 测试缓存CallSite调用var sw2 = Stopwatch.StartNew();for (int i = 0; i < 100000; i++)        {            SetMember(obj, "TestProperty", i);varvalue = GetMember(obj, "TestProperty");        }        sw2.Stop();        Console.WriteLine($"直接dynamic调用: {sw1.ElapsedMilliseconds}ms");        Console.WriteLine($"缓存CallSite调用: {sw2.ElapsedMilliseconds}ms");    }}

按一惯逻辑,写一缓存肯定效率上去,实际上dynamic每个调用点生成CallSite,效率更快。

上面版本需要修改一下,缓存版本才会快一些。

// 获取缓存的CallSite(避免循环中的字典查找)var setSite = SetMemberSites.GetOrAdd("TestProperty", name =>    CallSite<Func<CallSite, objectobjectobject>>.Create(        Binder.SetMember(CSharpBinderFlags.None, name, typeof(PerformanceOptimizedDynamic),new[] {    CSharpArgumentInfo.Create(CSharpArgumentInfoFlags.None, null),    CSharpArgumentInfo.Create(CSharpArgumentInfoFlags.None, null)        })    ));var getSite = GetMemberSites.GetOrAdd("TestProperty", name =>    CallSite<Func<CallSite, objectobject>>.Create(        Binder.GetMember(CSharpBinderFlags.None, name, typeof(PerformanceOptimizedDynamic),new[] { CSharpArgumentInfo.Create(CSharpArgumentInfoFlags.None, null) })    ));// 测试缓存CallSite调用var sw2 = Stopwatch.StartNew();for (int i = 0; i < 10000000; i++){    setSite.Target(setSite, obj, i);varvalue = getSite.Target(getSite, obj);}sw2.Stop();

🔍 常见坑点与解决方案

❌ 常犯错误1:过度使用dynamic

// 错误示例 - 能用静态类型就别用dynamicpublicdynamicProcessData(dynamic input){returnnew { Result = input.Value * 2 };}// 正确示例 - 明确输入输出类型public ProcessResult ProcessData<T>(T inputwhere T : IProcessable{returnnew ProcessResult { Value = input.Process() };}

在属性名固定的情况下,直接使用dynamic是最优选择;在属性名动态变化时,缓存CallSite才能体现出优势。

❌ 常犯错误2:忽略异常处理

// 错误示例 - 没有异常处理publicvoidBadExample(dynamic obj){var result = obj.SomeMethod(); // 可能抛出RuntimeBinderException}// 正确示例 - 完善的异常处理publicvoidGoodExample(dynamic obj){try    {if (HasMethod(obj, "SomeMethod"))        {var result = obj.SomeMethod();        }    }catch (RuntimeBinderException ex)    {// 记录日志并提供降级方案        Logger.LogWarning($"动态调用失败: {ex.Message}");    }}privateboolHasMethod(object obj, string methodName){return obj.GetType().GetMethod(methodName) != null;}

💎 三个收藏级代码模板

1. 通用JSON动态处理器

publicstaticclassJsonDynamicHelper{publicstaticdynamicParseAndEnhance(string json)    {dynamic obj = JsonConvert.DeserializeObject<ExpandoObject>(json);var dict = (IDictionary<stringobject>)obj;// 添加元数据        dict["_parseTime"] = DateTime.Now;        dict["_hasError"] = false;return obj;    }}

2. 安全的动态属性访问器

publicstaticclassSafeDynamic{publicstatic T GetValue<T>(dynamic obj, string propertyName, T defaultValue = default(T))    {try        {var dict = obj as IDictionary<stringobject>;if (dict?.ContainsKey(propertyName) == true)            {return (T)Convert.ChangeType(dict[propertyName], typeof(T));            }return defaultValue;        }catch        {return defaultValue;        }    }}

3. 动态对象构建器

publicclassDynamicBuilder{privatereadonly ExpandoObject _obj = new ExpandoObject();public DynamicBuilder Set(string key, objectvalue)    {        ((IDictionary<stringobject>)_obj)[key] = value;returnthis;    }publicdynamicBuild() => _obj;}

🎯 总结与展望

通过本文的学习,我们掌握了C#动态编程的精髓

  1. 1. ExpandoObject:最简单实用的动态对象解决方案
  2. 2. DynamicObject:自定义动态行为的强大基类
  3. 3. dynamic关键字:实现鸭子类型编程的利器

动态编程不是银弹,但在正确的场景下使用,能让我们的代码更加优雅和灵活。记住:能用静态类型就用静态类型,需要灵活性时才考虑动态特性


🤔 思考题:

  1. 1. 在你的项目中,有哪些场景可以用动态编程来简化代码?
  2. 2. 你觉得动态编程的最大优势和劣势分别是什么?

💬 互动时间:

如果你在使用C#动态特性时遇到过什么有趣的问题或有独特的应用场景,欢迎在评论区分享!让我们一起探讨更多动态编程的可能性。

觉得这篇文章对你有帮助吗?请转发给更多需要的C#开发同行,让更多人受益于动态编程的强大威力!


关注我,获取更多C#开发实战技巧和最佳实践分享

最新文章

随机文章

基本 文件 流程 错误 SQL 调试
  1. 请求信息 : 2026-02-08 01:21:03 HTTP/2.0 GET : https://f.mffb.com.cn/a/467949.html
  2. 运行时间 : 0.341517s [ 吞吐率:2.93req/s ] 内存消耗:4,614.51kb 文件加载:140
  3. 缓存信息 : 0 reads,0 writes
  4. 会话信息 : SESSION_ID=cdc22b56ad71953c3e325a31279de4ff
  1. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/public/index.php ( 0.79 KB )
  2. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/autoload.php ( 0.17 KB )
  3. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/composer/autoload_real.php ( 2.49 KB )
  4. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/composer/platform_check.php ( 0.90 KB )
  5. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/composer/ClassLoader.php ( 14.03 KB )
  6. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/composer/autoload_static.php ( 4.90 KB )
  7. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-helper/src/helper.php ( 8.34 KB )
  8. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-validate/src/helper.php ( 2.19 KB )
  9. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/helper.php ( 1.47 KB )
  10. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/stubs/load_stubs.php ( 0.16 KB )
  11. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Exception.php ( 1.69 KB )
  12. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-container/src/Facade.php ( 2.71 KB )
  13. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/symfony/deprecation-contracts/function.php ( 0.99 KB )
  14. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/symfony/polyfill-mbstring/bootstrap.php ( 8.26 KB )
  15. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/symfony/polyfill-mbstring/bootstrap80.php ( 9.78 KB )
  16. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/symfony/var-dumper/Resources/functions/dump.php ( 1.49 KB )
  17. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-dumper/src/helper.php ( 0.18 KB )
  18. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/symfony/var-dumper/VarDumper.php ( 4.30 KB )
  19. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/App.php ( 15.30 KB )
  20. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-container/src/Container.php ( 15.76 KB )
  21. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/psr/container/src/ContainerInterface.php ( 1.02 KB )
  22. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/app/provider.php ( 0.19 KB )
  23. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Http.php ( 6.04 KB )
  24. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-helper/src/helper/Str.php ( 7.29 KB )
  25. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Env.php ( 4.68 KB )
  26. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/app/common.php ( 0.03 KB )
  27. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/helper.php ( 18.78 KB )
  28. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Config.php ( 5.54 KB )
  29. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/app.php ( 0.95 KB )
  30. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/cache.php ( 0.78 KB )
  31. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/console.php ( 0.23 KB )
  32. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/cookie.php ( 0.56 KB )
  33. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/database.php ( 2.48 KB )
  34. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/facade/Env.php ( 1.67 KB )
  35. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/filesystem.php ( 0.61 KB )
  36. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/lang.php ( 0.91 KB )
  37. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/log.php ( 1.35 KB )
  38. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/middleware.php ( 0.19 KB )
  39. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/route.php ( 1.89 KB )
  40. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/session.php ( 0.57 KB )
  41. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/trace.php ( 0.34 KB )
  42. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/view.php ( 0.82 KB )
  43. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/app/event.php ( 0.25 KB )
  44. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Event.php ( 7.67 KB )
  45. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/app/service.php ( 0.13 KB )
  46. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/app/AppService.php ( 0.26 KB )
  47. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Service.php ( 1.64 KB )
  48. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Lang.php ( 7.35 KB )
  49. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/lang/zh-cn.php ( 13.70 KB )
  50. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/initializer/Error.php ( 3.31 KB )
  51. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/initializer/RegisterService.php ( 1.33 KB )
  52. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/services.php ( 0.14 KB )
  53. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/service/PaginatorService.php ( 1.52 KB )
  54. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/service/ValidateService.php ( 0.99 KB )
  55. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/service/ModelService.php ( 2.04 KB )
  56. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-trace/src/Service.php ( 0.77 KB )
  57. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Middleware.php ( 6.72 KB )
  58. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/initializer/BootService.php ( 0.77 KB )
  59. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/Paginator.php ( 11.86 KB )
  60. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-validate/src/Validate.php ( 63.20 KB )
  61. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/Model.php ( 23.55 KB )
  62. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/model/concern/Attribute.php ( 21.05 KB )
  63. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/model/concern/AutoWriteData.php ( 4.21 KB )
  64. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/model/concern/Conversion.php ( 6.44 KB )
  65. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/model/concern/DbConnect.php ( 5.16 KB )
  66. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/model/concern/ModelEvent.php ( 2.33 KB )
  67. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/model/concern/RelationShip.php ( 28.29 KB )
  68. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-helper/src/contract/Arrayable.php ( 0.09 KB )
  69. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-helper/src/contract/Jsonable.php ( 0.13 KB )
  70. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/model/contract/Modelable.php ( 0.09 KB )
  71. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Db.php ( 2.88 KB )
  72. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/DbManager.php ( 8.52 KB )
  73. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Log.php ( 6.28 KB )
  74. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Manager.php ( 3.92 KB )
  75. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/psr/log/src/LoggerTrait.php ( 2.69 KB )
  76. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/psr/log/src/LoggerInterface.php ( 2.71 KB )
  77. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Cache.php ( 4.92 KB )
  78. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/psr/simple-cache/src/CacheInterface.php ( 4.71 KB )
  79. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-helper/src/helper/Arr.php ( 16.63 KB )
  80. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/cache/driver/File.php ( 7.84 KB )
  81. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/cache/Driver.php ( 9.03 KB )
  82. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/contract/CacheHandlerInterface.php ( 1.99 KB )
  83. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/app/Request.php ( 0.09 KB )
  84. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Request.php ( 55.78 KB )
  85. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/app/middleware.php ( 0.25 KB )
  86. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Pipeline.php ( 2.61 KB )
  87. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-trace/src/TraceDebug.php ( 3.40 KB )
  88. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/middleware/SessionInit.php ( 1.94 KB )
  89. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Session.php ( 1.80 KB )
  90. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/session/driver/File.php ( 6.27 KB )
  91. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/contract/SessionHandlerInterface.php ( 0.87 KB )
  92. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/session/Store.php ( 7.12 KB )
  93. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Route.php ( 23.73 KB )
  94. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/route/RuleName.php ( 5.75 KB )
  95. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/route/Domain.php ( 2.53 KB )
  96. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/route/RuleGroup.php ( 22.43 KB )
  97. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/route/Rule.php ( 26.95 KB )
  98. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/route/RuleItem.php ( 9.78 KB )
  99. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/route/app.php ( 1.72 KB )
  100. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/facade/Route.php ( 4.70 KB )
  101. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/route/dispatch/Controller.php ( 4.74 KB )
  102. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/route/Dispatch.php ( 10.44 KB )
  103. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/app/controller/Index.php ( 4.81 KB )
  104. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/app/BaseController.php ( 2.05 KB )
  105. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/facade/Db.php ( 0.93 KB )
  106. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/connector/Mysql.php ( 5.44 KB )
  107. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/PDOConnection.php ( 52.47 KB )
  108. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/Connection.php ( 8.39 KB )
  109. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/ConnectionInterface.php ( 4.57 KB )
  110. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/builder/Mysql.php ( 16.58 KB )
  111. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/Builder.php ( 24.06 KB )
  112. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/BaseBuilder.php ( 27.50 KB )
  113. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/Query.php ( 15.71 KB )
  114. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/BaseQuery.php ( 45.13 KB )
  115. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/concern/TimeFieldQuery.php ( 7.43 KB )
  116. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/concern/AggregateQuery.php ( 3.26 KB )
  117. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/concern/ModelRelationQuery.php ( 20.07 KB )
  118. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/concern/ParamsBind.php ( 3.66 KB )
  119. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/concern/ResultOperation.php ( 7.01 KB )
  120. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/concern/WhereQuery.php ( 19.37 KB )
  121. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/concern/JoinAndViewQuery.php ( 7.11 KB )
  122. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/concern/TableFieldInfo.php ( 2.63 KB )
  123. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/concern/Transaction.php ( 2.77 KB )
  124. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/log/driver/File.php ( 5.96 KB )
  125. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/contract/LogHandlerInterface.php ( 0.86 KB )
  126. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/log/Channel.php ( 3.89 KB )
  127. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/event/LogRecord.php ( 1.02 KB )
  128. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-helper/src/Collection.php ( 16.47 KB )
  129. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/facade/View.php ( 1.70 KB )
  130. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/View.php ( 4.39 KB )
  131. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Response.php ( 8.81 KB )
  132. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/response/View.php ( 3.29 KB )
  133. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Cookie.php ( 6.06 KB )
  134. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-view/src/Think.php ( 8.38 KB )
  135. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/contract/TemplateHandlerInterface.php ( 1.60 KB )
  136. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-template/src/Template.php ( 46.61 KB )
  137. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-template/src/template/driver/File.php ( 2.41 KB )
  138. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-template/src/template/contract/DriverInterface.php ( 0.86 KB )
  139. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/runtime/temp/067d451b9a0c665040f3f1bdd3293d68.php ( 11.98 KB )
  140. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-trace/src/Html.php ( 4.42 KB )
  1. CONNECT:[ UseTime:0.000657s ] mysql:host=127.0.0.1;port=3306;dbname=f_mffb;charset=utf8mb4
  2. SHOW FULL COLUMNS FROM `fenlei` [ RunTime:0.001068s ]
  3. SELECT * FROM `fenlei` WHERE `fid` = 0 [ RunTime:0.003788s ]
  4. SELECT * FROM `fenlei` WHERE `fid` = 63 [ RunTime:0.000265s ]
  5. SHOW FULL COLUMNS FROM `set` [ RunTime:0.000475s ]
  6. SELECT * FROM `set` [ RunTime:0.001875s ]
  7. SHOW FULL COLUMNS FROM `article` [ RunTime:0.000714s ]
  8. SELECT * FROM `article` WHERE `id` = 467949 LIMIT 1 [ RunTime:0.087866s ]
  9. UPDATE `article` SET `lasttime` = 1770484863 WHERE `id` = 467949 [ RunTime:0.007765s ]
  10. SELECT * FROM `fenlei` WHERE `id` = 65 LIMIT 1 [ RunTime:0.002967s ]
  11. SELECT * FROM `article` WHERE `id` < 467949 ORDER BY `id` DESC LIMIT 1 [ RunTime:0.016251s ]
  12. SELECT * FROM `article` WHERE `id` > 467949 ORDER BY `id` ASC LIMIT 1 [ RunTime:0.020317s ]
  13. SELECT * FROM `article` WHERE `id` < 467949 ORDER BY `id` DESC LIMIT 10 [ RunTime:0.013082s ]
  14. SELECT * FROM `article` WHERE `id` < 467949 ORDER BY `id` DESC LIMIT 10,10 [ RunTime:0.038991s ]
  15. SELECT * FROM `article` WHERE `id` < 467949 ORDER BY `id` DESC LIMIT 20,10 [ RunTime:0.017655s ]
0.343228s