代码之家  ›  专栏  ›  技术社区  ›  Martin

如何基于动态字段名引用Linq中的字段

  •  7
  • Martin  · 技术社区  · 16 年前

    首先,为这个糟糕的问题标题道歉——不完全确定我问的是否正确。

    通常,我可以执行以下操作来访问字段:

    MyTables table = dc.MyTables.SingleOrDefault(p => p.id == someId);
    somevalue = table.samplefield;
    

    一些价值 样本场 .

    现在我有一个场景,我想填充一个变量,但在设计时我不知道表字段的名称。但是,我有一个字符串中的字段名。因此,是否可以使用此字符串获取值?

    5 回复  |  直到 16 年前
        1
  •  6
  •   Marc Gravell    16 年前

    您需要使用反射,如下所示:(未测试)

    somevalue = typeof(MyTable).GetProperty(fieldName).GetValue(table, null);
    
        2
  •  3
  •   Community Mohan Dere    9 年前

    string s = "sampleField"; ,则可以仅使用反射:

    object value = table.GetType().GetProperty(s).GetValue(table, null);
    

    确切地 如何识别PK稍微取决于实现—例如,要识别从LINQ到SQL的PK,请参阅 this answer 它查看数据上下文元数据。

        3
  •  3
  •   PeteT    16 年前

    http://www.hanselman.com/blog/TheWeeklySourceCode48DynamicQueryableMakesCustomLINQExpressionsEasier.aspx

    核心是:

    Dim Northwind As new NorthwindDataContext
    Dim query = Northwind.Products
            .Where("CategoryID=2 And UnitPrice>3")
            .OrderBy("SupplierID")
    GridView1.DataSource = query
    GridView1.DataBind()
    

    它可能需要一些动态数据引用。

        4
  •  2
  •   JaredPar    16 年前

    为了做到这一点,您需要使用反射。

    public object GetField(object obj, string fieldName) { 
      var t = obj.GetType();
      var field = t.GetField(fieldName);
      return field.GetValue(obj);
    }
    
    somevalue = GetField(table, "someFieldName");
    

    只要该字段同时是实例和公共字段,这种方法就有效。如果可访问性小于public,则需要稍微修改GetField方法调用。