2013-05-28 2 views
1

У меня есть следующее определение:добавлять атрибуты с помощью строки для динамического объекта

public class cell : DynamicObject { 

} 

[DataContract] 
public class rows { 
    [DataMember] 
    public List<cell> rows; 
} 

Позже в коде я:

dynamic dtCell = new cell(); 

Мне нужно, чтобы иметь возможность создавать атрибуты с разными именами каждый раз , Так что я в состоянии получить JSON как:

{ color: 'red', category: 'car'} or { country: 'US', city: 'Tampa', county: '...', ... } 

Как я могу создать атрибуты для динамического объекта так же, как добавление атрибутов к словарю в JavaScript или что-то подобное.

Я пробовал: dtCell.GetType().GetProperty('city') как я нашел в нескольких сообщениях, а возврат объекта - null.

Когда я делаю:

dtCell.GetType().GetProperty('city').SetValue(dtCell, 'Tampa', null)

я получаю исключение: dtCell.GetType().GetProperty("CustomerId").SetValue(dtCell, 3, null)' threw an exception of type 'System.Reflection.TargetInvocationException' dynamic {System.Reflection.TargetInvocationException}

Помощь ценится !!!

+0

После вы получите 'PropertyInfo' вы должны затем захватить' GetSetMethod' HTTP: // MSDN .microsoft.com/en-us/library/2ef4d5h3.aspx и запустить вызов против этого. В основном вы вызываете неправильный метод. – asawyer

ответ

2

Вместо DynamicObject вы можете использовать словарь. Для бывших,

Dictionary<string, string> dict = new Dictionary<string, string>() 
{ 
    {"country","US"}, {"city","Tampa"}, {"county","..."} 
}; 

var json = new JavaScriptSerializer().Serialize(dict); 

даст {"country":"US","city":"Tampa","county":"..."}

классы Анонимные могут быть использованы слишком

var obj = new { color = "red", category = "car" }; 
var json2 = new JavaScriptSerializer().Serialize(obj); 
+0

Не будет ли это решение сериализоваться WCF как {key: country, value: US} ...? Я пробовал этот подход, похоже, что мне нужно написать собственный сериализатор ... – user1791567

+0

@ user1791567 Вы можете изменить сериализатор JS по умолчанию для WCF с помощью 'JavaScriptSerializer' или' Json.Net'. – I4V

+0

@ user1791567 Вы также можете вернуть 'Stream'. Это означает, что вы можете использовать любой сериализатор, записать результат в MemoryStream и вернуть этот поток. – I4V

Смежные вопросы