Это не будет работать, потому что вы объявили словарь как Dictionary<string, object>
.
C # создает новый тип в фоновом режиме для вас (к которому вы не можете получить доступ), который имеет эти свойства (в дальнейшем известный каканонимный тип).Единственный раз, когда вы можете использовать его напрямую, это когда он все еще var
типа - как только вы добавите его в этот словарь, он будет приведен к object
и, таким образом, вы больше не сможете получить доступ к свойствам.
Вариант 1
Вместо этого вы можете попробовать Dictionary<string, dynamic>
.Dynamic сможет получить доступ к этим свойствам, но это поддерживается только в C # /. Net 4.0
Option 2
Вы можете получить тип обратно, используя метод, известныйв качестве демонстрации (приведен пример).Это не документированная функция, она расточительна и в некотором смысле взломана. Это ужасный злой трюк - особенно потому, что он не будет работать между сборками.
public static T Demonstrate<T>(this T demonstration, object value)
{
return (T)value;
}
Затем вы можете получить доступ к исходным свойствам следующим образом:
var area = new { name = "", today = 0, all = 0 }.Demonstrate(areas[name]);
var areaName = value.name;
Вариант 3 Это, честно говоря, лучший способ
Написать класс.Если вам нравится тот факт, что компилятор C # выполняет все функции Equals
, GetHashCode
и ToString
, вы можете просто использовать что-то вроде ILSpy для получения исходного кода.Таким образом:
class AreaInfo
{
public string Name { get; set; }
public int Total { get; set; }
public int All { get; set; }
public override bool Equals(object obj)
{
var ai = obj as AreaInfo;
if (object.ReferenceEquals(ai, null))
return false;
return Name == ai.Name && Total == ai.Total && All == ai.All;
}
public override int GetHashCode()
{
var hc = 0;
if (Name != null)
hc = Name.GetHashCode();
hc = unchecked((hc * 7) ^ Total);
hc = unchecked((hc * 21) ^ All);
return hc;
}
public override string ToString()
{
return string.Format("{{ Name = {0}, Total = {1}, All = {2} }}", Name, Total, All);
}
}
Исправьте свой словарь:
var areas = new Dictionary<string, AreaInfo>
{
{"Key1", new AreaInfo() {Name = "Name1", Today = 0, All = 0}},
{"Key2", new AreaInfo() {Name = "Name2", Today = 0, All = 0}},
...
};
И теперь все будет работать так, как вы ожидаете.