V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
PendingOni
V2EX  ›  程序员

自己写了一段 snippet,可以获取 EF Core 中的实体在控制器内的引用

  •  
  •   PendingOni ·
    Komi-Thaw · 2022-10-11 14:02:44 +08:00 · 830 次点击
    这是一个创建于 769 天前的主题,其中的信息可能已经有所发展或是发生改变。
        [Route("api/[controller]")]
        public class loopdisc : Controller
        {
            private readonly IActionDescriptorCollectionProvider _provider;
    
            public loopdisc(IActionDescriptorCollectionProvider provider)
            {
                _provider = provider;
            }
    
            [HttpPost("mainstart")]
            public Task<IActionResult> getresult()
            {
                var dataDic = typeof(BaseContext).GetProperties(BindingFlags.Public | BindingFlags.Instance);
                var names = new List<string>();
                names.AddRange(dataDic.Where(x => x.PropertyType.GenericTypeArguments.Any())
                    .Select(x => x.PropertyType.GenericTypeArguments.First().Name));
    
                var ls = _provider.ActionDescriptors.Items.Select(e => e is ControllerActionDescriptor mau
                        ? (
                            mau.ControllerTypeInfo.DeclaredMethods
                                .First(x => x.Name.Equals(mau.ActionName)).GetMethodBody()
                                ?.LocalVariables.Select(jim =>
                                    jim.LocalType.GenericTypeArguments.Any() &&
                                    names.Contains(jim.LocalType.GenericTypeArguments[0].Name)
                                        ? jim.LocalType.GenericTypeArguments[0].Name
                                        : string.Empty
                                )
                            ,
                            $"{mau.ControllerName}/{mau.ActionName}".ToLowerInvariant())
                        : default)
                    .ToList();
    
                var copy = ls.Where(x => x.Item1.Any(min => !string.IsNullOrEmpty(min)))
                    .Select(x => new { sets = x.Item1.ToHashSet(), router = x.Item2 });
    
                return Task.FromResult<IActionResult>(Ok(copy));
            }
        }
    

    gist 地址 -> https://gist.github.com/KomiSans/7cbcb6c3bf885a08002313e9ff1fee22

    目前尚无回复
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1101 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 32ms · UTC 19:22 · PVG 03:22 · LAX 11:22 · JFK 14:22
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.