如何将namevaluecollection自动化为强类型类?

Sam*_*Sam 9 c#

我将应用程序的配置详细信息存储在如下表中:

SettingName                   SettingValue
--------------------          ---------------------
PostsPerPage                  10   
EmailErrors                   True
AdminEmailAddress             admin@admin.com
Run Code Online (Sandbox Code Playgroud)

我的dataaccess类说返回表中存储的设置的namevaluecollection/keyvaluepair.

将namevaluecollection/keyvaluepair映射到强类型类的最佳方法是什么,如下面那个具有与SettingName Column中相同的属性的类.

public class Settings
{
    public int PostsPerPage{get;set;}
    public bool EmailErrors{get;set;}
    public string AdminEmailAddress{get;set;}
}
Run Code Online (Sandbox Code Playgroud)

C.L*_*ist 7

如果您的项目中有Newtonsoft Json库,这是另一个快捷方式-您可以将其用作翻译机制。不知道这是否是出色的性能,但是它非常简洁和简单...

假设“表单”是您的“ NameValueCollection”对象...

// convert to a string/string dictionary and remove anynulls that may have been passed in as a string "null"
var formDictionary = form.AllKeys
                     .Where(p => form[p] != "null")
                     .ToDictionary(p => p, p => form[p]);
string json = JsonConvert.SerializeObject(formDictionary);
var myObject = JsonConvert.DeserializeObject<MyClass>(json);
Run Code Online (Sandbox Code Playgroud)


slu*_*ter 5

使用反射。在伪代码中:

Settings mySettingsClass = new Settings();
foreach (KeyValuePair<string, object> kvp in mySettings) 
{
    PropertyInfo pi = mySettingsClass.GetType().GetProperty(kvp.key, BindingFlags.Public | BindingFlags.Instance);
    if (pi != null) 
    {
        pi.SetValue(mySettingsClass, kvp.Value, null);
    }
}
Run Code Online (Sandbox Code Playgroud)

当然,如果你是从一个dataReader中读回来,那么你可以采取稍微不同的方法并避免使用反射(因为DataReader的结构和目标对象的结构是已知的)。在这种情况下使用反射速度较慢,但​​它是一种将数据从一个项目普遍映射到另一个项目的好方法 - 基本上,您获取源属性,查看目标属性是否存在于目标对象上,如果存在,则分配该值。