如何使用LINQ优化多个if else

时间:2013-10-29 14:48:20

标签: c# .net linq c#-4.0

我有一个静态类:

 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"];

            }

现在这将完成这项工作但是如果有条件的话会有很多。我试过LINQ,但这是我最接近的。

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

并没有任何好处。请其他任何想法。

3 个答案:

答案 0 :(得分:3)

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;

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

答案 1 :(得分:2)

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

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);
}

答案 2 :(得分:0)

我们必须从ReadConfiguration();获得什么样的返回类型?

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

否则,您可以通过确定静态类的属性来实现反射,并假设Configuration中的属性以相同的方式命名,然后以这种方式分配值。