【问题标题】:C# Entity Framework6 Specify the property of the table in parameterC# Entity Framework6 在参数中指定表的属性
【发布时间】:2018-04-18 03:37:27
【问题描述】:

我的应用程序必须更新我数据库中的很多参数(在不同的表中,参数是无序的)。我只是读取了一个标签(名称)和一个值,并且必须根据名称将值存储在数据库中的正确位置。

目前我使用 switch(),但这个解决方案似乎并不好,因为每个参数的处理方式不同,并且将来可能会变得非常繁重(我有超过 500 个参数)。

这里是代码(现在有开关)

private void MyFunc(int id, int value, string name_param){

using (var db = new mydatabaseEntities())
{
    var result = db.mytable.Where(b => b.id == id).First();

    switch (name_param){
         case "M12":
              result.m12 = value;
              break;
         case "M14":
              result.m14 = value;
              break;
         case "M16":
              result.m16 = value;
              break;
         //etc... 500 cases
     }
   db.SaveChanges();
   }
}

您知道如何在参数中指定我要更新表的哪个属性:m12、m14、m16...(所以我不需要使用开关)?

谢谢!

【问题讨论】:

    标签: c# parameters entity-framework-6


    【解决方案1】:

    你应该可以通过反思来做到这一点:

    private void MyFunc(int id, int value, string name_param)
    {
        using (var db = new mydatabaseEntities())
        {
            var result = db.mytable.Where(b => b.id == id).First();
            var prop = result.GetType().GetProperty(name_param);
    
            if (prop == null)
                throw new InvalidOperationException();    //Or something appropriate
    
            prop.SetValue(result, value);
    
            db.SaveChanges(); 
        }
    }
    

    请注意,这会使用反射,并且执行大量操作可能会很慢。您可以通过缓存类型信息和属性来加快速度。

    顺便说一句,如果您的name_param 大小写与属性名称不同,您可以使用 LINQ 缩小范围:

    var prop = result.GetType()
                     .GetProperties()
                     .Where(p => string.Compare(p.Name, param_name, true) == 0)
                     .FirstOrDefault();
    

    或者只使用正确的绑定标志:

    var prop = result.GetType().GetProperty(name_param, 
                                  BindingFlags.IgnoreCase |
                                  BindingFlags.Public | 
                                  BindingFlags.Instance);
    

    【讨论】:

    猜你喜欢
    • 2020-04-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-17
    • 2021-08-16
    相关资源
    最近更新 更多