如何使用 LINQ 优化倍数(如果不是)

本文关键字:如果不 何使用 LINQ 优化 | 更新日期: 2023-09-27 18:37:14

我有一个静态类:

 public static class ConfigurationDetails
    {
        public static string SharepointServer { get; set; }
        public static string Username { get; set; }
        public static string Password { get; set; }
        public static string SharepointDomain { get; set; }
        public static string ServiceLibrary { get; set; }
        public static string SqlServer { get; set; }
        public static string SQLUsername { get; set; }
        public static string SQLPassword { get; set; }
        public static string SQLDomain { get; set; }
    }

需要从字典的值更新。如果代码如下,则使用:

var configValues = ReadConfiguration();

 if (configValues.ContainsKey("SharepointServer"))
            {
                ConfigurationDetails.SharepointServer = configValues["SharepointServer"];
            }
            if (configValues.ContainsKey("ServiceLibrary"))
            {
                ConfigurationDetails.ServiceLibrary = configValues["ServiceLibrary"];
            }
            if (configValues.ContainsKey("Username"))
            {
                ConfigurationDetails.Username = configValues["Username"];
            }
            if (configValues.ContainsKey("Password"))
            {
                ConfigurationDetails.SharepointServer = configValues["Password"];
            }

现在这将完成这项工作,但会有很多 if 条件。我尝试过使用 LINQ ,但这是最接近我的。

 configValues.Where(kv => kv.Key == "SharepointServer").ToList().ForEach(kv => ConfigurationDetails.SharepointServer = kv.Value);

而且它没有任何好处。请提出任何其他想法。

如何使用 LINQ 优化倍数(如果不是)

LINQ 在这里不是正确的工具。但无论如何你都可以改进它:

string value;
if (configValues.TryGetValue("SharepointServer", out value))
    ConfigurationDetails.SharepointServer = value;
if (configValues.TryGetValue("ServiceLibrary", out value))
    ConfigurationDetails.ServiceLibrary = value;
if (configValues.TryGetValue("Username", out value))
    ConfigurationDetails.Username = value;
if (configValues.TryGetValue("Password", out value))
    ConfigurationDetails.Password = value;

这更简洁,甚至更有效(尽管在这种情况下并不重要)。

您可以使用反射来使用配置值填充静态类:

var type = typeof(ConfigurationDetails);
var flags = BindingFlags.Static | BindingFlags.Public;
foreach(var kvp in configValues)
{        
    var property = type.GetProperty(kvp.Key, flags);
    if (property != null)
       property.SetValue(null, kvp.Value);
}

我们必须从ReadConfiguration();中期望什么返回类型?

如果它是一个列表,那么具有静态类成员的存储将导致数据丢失,因为只会存储最后一个值,而较早的值将被覆盖。

否则,您可以通过确定静态类的属性并假设配置中的属性以相同的方式命名,然后以这种方式分配值来使用反射来执行此操作。