2013-04-30 3 views
1

Я пишу обертку вокруг некоторой библиотеки данных, которая выполняет SQL-выражения и возвращает результаты.C# dynamic: назначить свойства динамически

Команда ExecuteQuery должна в идеале возвращать IEnumerable<T> в зависимости от того, к какому типу объекта относится карта результатов запроса. Проблема в том, что я не могу знать, какой тип это будет, и поэтому я предпочел бы вернуть тип IEnumerable<dynamic>.

Это все хорошо до сих пор, за исключением того, что я хочу, чтобы свойства динамических объектов были такими же, как и столбцы, запрашиваемые для них, но я не могу найти все равно, чтобы назначить это. В настоящее время у меня есть все имена столбцов в массиве col [] например

dynamic obj = new {} as dynamic; 
for(int i = 0; i < col.Length; i++){ 
    //say col[i] == 'id', I want obj.id = someValue 
    obj.? = someValue; ??? 
} 

Надеюсь, это ясно. Надеюсь, это не невозможно!

p.s. Я пишу это для WP7, поэтому мои варианты сильно ограничены, возможно, было бы хорошо помнить об этом.

Спасибо вам за помощь.

+0

Благодарность за @DanielHilgarth правок, мой типирование просто повсюду –

+0

Похоже, без в.ч.: [Динамически установить имя свойства в C# анонимного типа] (http://stackoverflow.com/questions/1642733/dynamically-set-the-property-name-of-ac-sharp-anonymous-type) – nawfal

ответ

1

dynamic не применяется в вашем случае. Вы используете dynamic, когда знаете имя свойства на , компилируйте время, но не фактический тип, на котором будет определено свойство.

Если вы знаете имя свойства только во время выполнения, вы должны будете использовать обычное отражение, что-то вроде этого:

obj.GetType() 
    .GetProperty(col[i]) 
    .SetValue(obj, someValue); 

Обратите внимание, что dynamic obj = new {} as dynamic; не имеет абсолютно никакого смысла. Это создаст анонимный тип без каких-либо свойств. Присвоение его переменной dynamic не изменяет того факта, что у нее нет - и никогда не будет - каких-либо свойств.

Если вы пытаетесь динамически добавлять свойства к объекту, вы можете использовать ExpandoObject.

Usage будет выглядеть так:

IDictionary<string, object> obj = new ExpandoObject(); 
for(int i = 0; i < col.Length; i++) 
{ 
    obj.Add(col[i], someValue); 
} 

return (dynamic)obj; 
+0

Хорошо, круто попробует, спасибо. –

+0

Err, так вы говорите, что, предполагая другой сценарий, если я сделал obj.SomeProperty = "some value"; что obj все равно не будет иметь никаких свойств? Причина, по которой я делал это, чтобы ссылка не была нулевой! –

+0

@ObiOnuorah: Действительно. Вы просто получите 'RuntimeBinderException': * '' <> f__AnonymousType0'' не содержит определения для 'SomeProperty' *. –

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