如何在运行时创建数据库列的动态属性?

How can I create dynamic properties of database columns at runtime?

提问人:Mohamad Usman 提问时间:11/10/2023 最后编辑:Mohamad Usman 更新时间:11/11/2023 访问量:56

问:

我想完全动态地创建同步数据网格。我正在尝试创建一个动态类,该类在运行时创建属性,而不是硬编码的属性。请指导我该怎么做。 我试过什么:

Sp 类

公共类 Sp:DynamicObject {

    Dictionary<string, object> properties = new Dictionary<string, object>();

    public override bool TryGetMember(GetMemberBinder binder, out object result)

    {

        string name = binder.Name;

        return properties.TryGetValue(name, out result);

    }

    public override bool TrySetMember(SetMemberBinder binder, object value)

    {

        properties[binder.Name] = value;

        return true;

    }

    public override IEnumerable<string> GetDynamicMemberNames()

    {

        return properties?.Keys;

    }

}

ApplicationDbContext

公共类 ApplicationDbContext:DbContext

{

    public ApplicationDbContext(DbContextOptions<ApplicationDbContext> options): base(options)

    {



    }

    public DbSet<Sp> DisplaySp { get; set; }

    protected override void OnModelCreating(ModelBuilder modelBuilder)

    {

        modelBuilder.Entity<Sp>().HasNoKey();

        base.OnModelCreating(modelBuilder);

    }

}

控制器端

[Http获取]

    [Route("Getspdetails")]

    public Task<List<Sp>> GetData()

    {

        var result = _services.Get();

        return result;

    }

服务

公共异步 Task<List> Get()

    {

        var data = _context.DisplaySp.FromSqlRaw("Execute Tbl_DailySaleRpSP @nType = 0,@nsType = 2").ToList();

        return data;

    }

剃刀页面

    <GridPageSettings PageSize="10"></GridPageSettings>

    <GridAggregates>

        <GridAggregate>

            <GridAggregateColumns>

                @foreach (var col in columns)

                {

                    <GridAggregateColumn Field="@col" Type="AggregateType.Sum">

                        <FooterTemplate>

                            @{

                                var aggregate = (context as AggregateTemplateContext);

                                <div>

                                    <p>@aggregate?.Sum</p>

                                </div>

                            }

                        </FooterTemplate>

                    </GridAggregateColumn>

                }

            </GridAggregateColumns>

        </GridAggregate>

    </GridAggregates>

</SfGrid>

@code {

public List<Sp> Spdetails { get; set; } = new List<Sp>();

public List<string> columns { get; set; } = new List<string>();

protected override async Task OnInitializedAsync()

{

    Spdetails = await Http.GetFromJsonAsync<List<Sp>>("Getspdetails");

    if (Spdetails != null && Spdetails.Count > 0) {

        PropertyInfo[] props = typeof(Sp).GetProperties();

        foreach (var prop in props)

        {

            if (prop.PropertyType == typeof(int) || prop.PropertyType == typeof(double) || prop.PropertyType == typeof(decimal))

            {

                columns.Add(prop.Name);

            }

        }

    }

}

请仔细阅读代码并指导我,因为现在我收到“序列没有元素”的错误。

C# 剃刀页 blazor-webassembly 动态类

评论

1赞 JonasH 11/10/2023
如果真的是做你正在做的任何事情的最佳方式,我会多想一点。的主要用例是与 COM、javascript 或类似工具的互操作。如果要更新 UI,可能有更好的方法。dynamicdynamic
0赞 Bennyboy1973 11/10/2023
你问的是机制,但不清楚你真正想要实现什么。没有冒犯,但对于刚接触框架的人来说,这是非常高级的东西。为什么你会有这么多/如此灵活的对象来做这件事?
0赞 Mike Brind 11/10/2023
看看 WebGrid 的源代码以获得灵感,如果你真的想走这条路,它是一个基于动态的网格,它随非常旧的 Web Pages 框架一起提供:github.com/aspnet/AspNetWebStack/blob/main/src/...。由于其他人也提出了这一点,我将提到 Web Pages 框架的死亡,主要是因为严重依赖动态类型,调试起来是一场噩梦,大多数异常发生在运行时。
0赞 Mohamad Usman 11/11/2023
我只想创建一个动态类,该类将在运行时创建属性。正如您在 Sp 类中看到的,注释的属性是硬编码的属性,因此我想创建一个动态类,其中属性将根据来自数据库的类型进行创建。
0赞 MrC aka Shaun Curtis 11/12/2023
正如其他人已经回避的那样,构建这样的组件需要严肃的编码技能。尝试修改第三方代码以执行此操作可能是不可能的。提供此类知识远远超出了 SO 答案的范围。

答: 暂无答案