字典<tkey,object>修改索引器以在返回值之前进行转换

时间:2015-10-29 11:48:32

标签: c# dictionary casting .net-2.0

我在question:中看到了这一点:

在添加到字典

之前,

编辑类型已知

You could use Dictionary<string, object>, then you'd need to cast the results:

int no = 1;       
string str = "world";
Dictionary dict = new Dictionary<string,object>();

dict.add( "intObj" , no  );
dict.add( "intObj" , str );


int a = (int) Storage.Get("age"); //everthing was perfect till i see cast .
string b = (string) Storage.Get("name");
double c = (double) Storage.Get("bmi");

问题:如何在返回值之前修改square-Brackets []以转换类型 所以它看起来像这样;

int a = dict["intObject"] ;   //we got rid of casting forever
string b = dict["stringObject"] ;
谢谢。

2 个答案:

答案 0 :(得分:2)

您无法直接修改索引器。您可以做的是创建一个扩展方法,为您(部分)执行此操作:

public static class DictionaryExtensions
{
    public static T Get<T>(this Dictionary<string, object> dictionary, string key)
    {
        object value = null;
        return dictionary.TryGetValue(key, out value) ? (T)value : default(T);
    }
}

请注意,这有一些缩短:

  1. 如果有人插入带有null的密钥,那么如果值是值类型,您将在运行时获得强制转换异常。

  2. 如果值类型的值不存在,则您将获得每个基元的默认值。请注意,您无法真实地指出密钥是否存在于字典中。

答案 1 :(得分:1)

(在提到.NET 2.0要求之前回答 - 它可能对其他人有用。)

您可以使用Dictionary<string, dynamic>代替 - 此时表达式dict["stringObject"]的编译时类型将为dynamic。然后,对string类型变量的赋值将在执行时执行转换。

您无法改变Dictionary<string, object>的行为方式。您将 更改类型参数...不,您不能使用.NET 2.0执行此操作。