C # Обнаружение AnonymousType new {name = value,} и преобразование в словарь <строка, объект> - PullRequest
9 голосов
/ 17 июля 2009

Мне нужно определить, был ли объект создан анонимно, как new {name = value,}

если это AnonymousType, он должен добавить имена / значения своих свойств в

Dictionary<string,object>

Вот что я взломал вместе:

var name="name";

var obj = new { name = new object(), };

var lookup = new Dictionary<string,object>();


if(obj.GetType().Name.StartsWith("<>f__AnonymousType"))
{
    foreach (var property in obj.GetType().GetProperties())
    {
        lookup[property.Name] = property.GetValue(obj, null);
    }
}
else
{
    lookup[name]=obj;
}

Мне было интересно, есть ли лучший / более быстрый способ обнаружения AnonymousTypes, или если есть лучший / более быстрый способ вывести имена / значения свойств объекта в

Dictionary<string,object>

Ответы [ 3 ]

24 голосов
/ 17 июля 2009

Чтобы получить все свойства объекта со значениями в Dictionary, вы можете связать мощность Linq с объектами с отражением.

Вы можете использовать метод Enumerable.ToDictionary :

var dic = obj.GetType()
             .GetProperties()
             .ToDictionary(p => p.Name,  p=> p.GetValue(obj, null));

Это вернет вам Dictionary<string, object>.

6 голосов
/ 17 июля 2009

Использовать новый синтаксис инициализатора объекта коллекции вместо анонимного типа:

var obj = new Dictionary<string, object>()
{
    { "Name", t.Name },
    { "Value", t.Value }
};
2 голосов
/ 17 июля 2009

Обнаружение анонимного типа является небольшим трудным; не в последнюю очередь это зависит от языка! VB anon-типы не похожи на C # anon-типы. Я сомневаюсь в логике, которая по-разному действует на разные типы. Вы можете проверить на [CompilerGenerated], но обратите внимание, что это не просто означает «анонимный тип» - есть другие, которые делают это.

Лично я бы не стал различать в этом сценарии.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...