如何在字典对象中获取动态数据类型

时间:2017-01-09 12:30:40

标签: c# asp.net

你好我想出了我以querystring的形式从用户那里获取价值的情况。 前两个参数的名称是修复的,因此查询字符串的名称是固定的。在这两个参数之后,用户可以输入或不输入任何参数。参数计数可以是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。如何接受?

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

2 个答案:

答案 0 :(得分:2)

查询字符串作为名称说它是string(由两个字符串组成的键值对的集合(键和值))所以基本上你无法确定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]));
}

答案 1 :(得分:1)

您可以将Dictionary<string, object> queryStringValues = new Dictionary<string, object>(); 与对象一起使用。

queryStringValues.Add("2", true);

注意,之后你应该将你的对象转换为knwon类型,例如:

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

...

{{1}}