1

我有一个静态类:

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

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

4

3 回答 3

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;

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

于 2013-10-29T14:53:06.080 回答
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);
}
于 2013-10-29T14:52:22.927 回答
0

我们必须期待什么返回类型ReadConfiguration();

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

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

于 2013-10-29T14:54:45.967 回答