如何在字典对象中使用动态数据类型

如何在字典对象中使用动态数据类型

问题描述:

您好,我想出了以查询字符串的形式从用户获取价值的情况。 第2个参数的名称是固定的,所以查询字符串的名称是固定的。这两个参数后,用户可以输入或不输入任何参数。参数的数量可以从1到多个,数据类型不同。如何在字典对象中使用动态数据类型

Ex: sitename/sample.aspx?username=''&userid=''&Date= 
Ex: sitename/sample.aspx?username=''&userid=''&Date=&amount= 

这就是为什么我创建的字典对象和动态查询字符串的存储键和值到它(不是用户名和用户ID)。

Dictionary<string, string> queryStringValues = new Dictionary<string, string>(); 

foreach (string key in Request.QueryString.AllKeys) 
{ 
    queryStringValues.Add(key, Request.QueryString[key]); 
} 

在这里,我已经创建的<string,string>字典。但我的重点必须是string和值可能不string。它可以是intdate。如何获取?

最后我想检查值的数据类型?怎么做?

+0

是否必须是一个'Dictionary'? – smoksnes

您可以使用Dictionary与对象。

Dictionary<string, object> queryStringValues = new Dictionary<string, object>(); 

注意,之后该OU应该投你的对象knwon型,东西为:正如其名说,这是一个string

queryStringValues.Add("2", true); 

...

var q = queryStringValues["2"]; 
if (q is bool) 
{ 
    var r = !(bool)q; 
} 
+0

没有适当的转换它不会按预期工作。 [结果在这里](http://rextester.com/SSWI26146) –

+0

@ m.rogalski我已修复您的示例:http://rextester.com/CPYPG68650您有两个字符串,不是字符串和布尔值。 –

+0

'Request.QueryString [key]'将返回'string'而不是'bool'或'object'。你可以在[documentation]中阅读(https://msdn.microsoft.com/en-us/library/system.web.httprequest.querystring(v = vs.110).aspx) –

查询字符串由2个字符串(键和值)组成的键值对的集合),所以基本上你不知道Date的值是否可以转换为DateTime对象。

虽然可以制造像工厂(我已经在几个月前完成)的东西,将key与不同的Type配对。

为了更详细地解释:

public static class Factory 
{ 
    static Dictionary<string, Type> _fac = new Dictionary<string, Type>(); 

    public static void Assign<T>(string key) 
    { 
     if(_fac.ContainsKey(key)) 
     { 
      if(_fac[key] != typeof(T)) _fac[key] = typeof(T); 
     } 
     else 
     { 
      _fac.Add(key, typeof(T)); 
     } 
    } 

    public static object Retrieve(string key, string value) 
    { 
     if(_fac.ContainsKey(key)) 
     { 
      if(_fac[key] == typeof(string)) 
       return value; 

      TypeConverter converter = TypeDescriptor.GetConverter(_fac[key]); 
      if(converter.CanConvertFrom(typeof(string)) 
       return converter.ConvertFromString(value); 
     } 
     return null; 
    } 

    public static Type TypeFor(string key) 
    { 
     if(_fac.ContainsKey(key)) 
      return _fac[key]; 

     return null; 
    } 
} 

要使用这个简单的做这样的事情:

Factory.Assign<DateTime>("date"); 

// later on, you can retrieve value using this: 
// assume query is "Date=01/01/2001" 
Dictionary<string, object> queryStringValues = new Dictionary<string, object>(); 
foreach (string key in Request.QueryString.AllKeys) 
{ 
    queryStringValues.Add(key, Factory.Retrieve(key, Request.QueryString[key])); 
}