我将应用程序的配置详细信息存储在如下表中:
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)
如果您的项目中有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)
使用反射。在伪代码中:
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的结构和目标对象的结构是已知的)。在这种情况下使用反射速度较慢,但它是一种将数据从一个项目普遍映射到另一个项目的好方法 - 基本上,您获取源属性,查看目标属性是否存在于目标对象上,如果存在,则分配该值。
| 归档时间: |
|
| 查看次数: |
4550 次 |
| 最近记录: |