C# dynamic: назначать свойства динамически
Я пишу обертку вокруг некоторой библиотеки данных, которая выполняет операторы SQL и возвращает результаты.
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; ???
}
Я надеюсь, что это понятно. Я надеюсь, что это не невозможно!
ps Я пишу это для WP7, так что мои возможности сильно ограничены, возможно, стоит помнить об этом.
Спасибо за помощь.
1 ответ
dynamic
не применимо в вашем случае. Ты используешь dynamic
когда вы знаете имя свойства во время компиляции, но не фактический тип, для которого будет определено свойство.
Если вы знаете имя свойства только во время выполнения, вам придется использовать обычное отражение, что-то вроде этого:
obj.GetType()
.GetProperty(col[i])
.SetValue(obj, someValue);
Обратите внимание, что dynamic obj = new {} as dynamic;
не имеет абсолютно никакого смысла. Это создаст анонимный тип без каких-либо свойств. Назначение его dynamic
Переменная не меняет того факта, что она не имеет и никогда не будет иметь никаких свойств.
Если вы пытаетесь динамически добавлять свойства к объекту, вы можете использовать ExpandoObject
,
Использование будет таким:
IDictionary<string, object> obj = new ExpandoObject();
for(int i = 0; i < col.Length; i++)
{
obj.Add(col[i], someValue);
}
return (dynamic)obj;