Когда я вижу подобный шаблон встроенного языка, я склонен использовать методы расширения, поэтому я могу написать следующий код для достижения своей цели:
public Test()
{
var data = Enumerable.Range(1, 5).Select(i => new
{
Id = i,
Foo = "Foo",
Bar = 2
}.AsDynamicDictionary());
}
Тогда я бы определил метод расширения с кодом для преобразования любых object
(включая анонимно набранные) в DynamicDictionary
:
public static class DynamicDictionaryExtensions
{
public static DynamicDictionary AsDynamicDictionary(this object data)
{
if (data == null) throw new ArgumentNullException("data");
return new DynamicDictionary(
data.GetType().GetProperties()
.Where(p => p. && p.CanRead)
.Select(p => new {Name: p.Name, Value: p.GetValue(data, null)})
.ToDictionary(p => p.Name, p => p.Value)
);
}
}
Вы должны реализовать конструктор в DynamicDictionary
, чтобы получить IDictionary<string, object>
, но это очень просто.