C#通过变量名访问对象

C#通过变量名访问对象,c#,C#,用我的代码解释会非常容易,所以 private void dtSelectorLoad_Click(object sender, RoutedEventArgs e) { MessageBox.Show(dtSelector.SelectedValue != null ? dtSelector.SelectedValue.ToString() : "I have 0 selected items!"); var query = fr

用我的代码解释会非常容易,所以

    private void dtSelectorLoad_Click(object sender, RoutedEventArgs e)
    {
        MessageBox.Show(dtSelector.SelectedValue != null ? dtSelector.SelectedValue.ToString() : "I have 0 selected items!");
        var query =
        from obj in dataEntities.someTable
        select obj;
        primaryDataGrid.ItemsSource = query.ToList();

    }
本质上,基于
dtSelector.SelectedValue.ToString()的值
我需要从dataEntities中的obj执行
。someTable
其中
someTable
dtSelector.SelectedValue.ToString()的值


我怎样才能做到这一点?把我的头撞在墙上。最终的结果是,当用户单击按钮时,它将使用列表框中当前选定的表中的数据填充dataGrid

之所以看起来不可能(事实并非如此),是因为您所做的违背了每一个编程和数据库原则。特别是,关系数据库是在字段条件下进行查询的,而不是在具有相同模式的多个表之间进行拆分。老实说,如果你为我这样做,你将在一天结束时被解雇

但是,如果您坚持这一点,您有两个选择:

  • 反射允许您根据属性的名称访问属性。祝贺您,您将SQL注入引入了WinForms

  • 一个关于所有可能值的简单switch语句,它将请求转发到正确的表。当然,这并不能精确地扩展到新值,因为您必须重新编译代码以添加新值,但在这一点上,我们将任何形式的专业精神抛到了窗外


  • 之所以看起来不可能(事实并非如此),是因为您所做的违背了每一个编程和数据库原则。特别是,关系数据库是在字段条件下进行查询的,而不是在具有相同模式的多个表之间进行拆分。老实说,如果你为我这样做,你将在一天结束时被解雇

    但是,如果您坚持这一点,您有两个选择:

  • 反射允许您根据属性的名称访问属性。祝贺您,您将SQL注入引入了WinForms

  • 一个关于所有可能值的简单switch语句,它将请求转发到正确的表。当然,这并不能精确地扩展到新值,因为您必须重新编译代码以添加新值,但在这一点上,我们将任何形式的专业精神抛到了窗外


  • 什么是数据实体
    ?它是一个实体框架
    DbContext
    dtSelector。SelectedValue
    确定要查询的
    DbSet
    ?是的,正是这样。dtSelector.SelectedValue是我用实体数据库模型中的所有表名填充的列表框。我只是希望用户能够从下拉列表中选择要查询的表,单击按钮,然后让它将该表加载到datagrid中?它是一个实体框架
    DbContext
    dtSelector。SelectedValue
    确定要查询的
    DbSet
    ?是的,正是这样。dtSelector.SelectedValue是我用实体数据库模型中的所有表名填充的列表框。我只是希望用户能够从下拉列表中选择他们想要查询的表,单击按钮,然后让它将该表加载到datagrid中。虽然我同意这个答案(并且我已经+1'ed),但再次(像另一个-现在已删除-答案一样),立即假设SQL注入(在本例中为EF注入;-))仅仅因为表格是可变的,就-错了-。。。如果变量可以通过用户输入进行修改,那么它是可以注入的,但是除了它来自“SelectedValue”(可以来自常量列表)之外,我们从问题中不知道这一点。同样,答案的其余部分完全是+1-able:-)您误读了我写的内容,因为这两点都不允许Sql注入。第一点是,如果您使用基于非净化输入字符串的反射,您可以访问EF上下文中可用的任何属性——您仍然不能注入任何内容,但您可以访问其他隐藏的属性。在第二点中,输入被手写的
    switch
    语句的本质所净化。哦,是的,当然。我明白了。我是专门谈论第一点的。。。如果名称是用户输入和/或未初始化,则该选项是适用的,但问题中没有任何地方表示该名称是用户输入,答案中也没有任何地方表示必须对其进行消毒,因此其他人在阅读本文时可能会有其他想法(我完全明白你为什么要写它,但对于不了解SQL注入的人来说可能不太清楚,他们可能会认为仅仅通过使用反射,你就可以接受SQL注入(你不是这样)我很欣赏这个答案——但这似乎有些矛盾。我问这个问题的原因是因为我不知道,如果我知道最安全、最专业的方法,我就不会问了。显然,选项2似乎更合适,但同样,我也不想每次添加新表时都重新编译,有没有办法做到这一点没有你提到的警告?很高兴知道你会解雇我,但我不是一个专业程序员,只是一个有兴趣学习的人。@PnP如果你想动态加载不同的表-不同的模式-(可能只是为了显示,而不是对它们做任何事),那么在这种情况下,可能是实体框架(这是一种具有严格类型映射的ORM)并不是这项工作的最佳工具,您最好构造SQL语句,并使用
    Dapper
    或类似工具将它们映射到字典(或构建没有模式的json文档)。除非模式上有一些共同点(您可以基于这些模式创建类型),EF和Linq在我看来-可能,而且不知道您的项目-这里只是一个错误的选择,尽管我同意这个答案(并且我已经+1'ed),再次(像另一个-现在已删除-答案),立即假设SQL注入(或者在本例中是EF注入;-)仅仅因为表是变量是-错误的-…它是开放的注入-如果