Привязка данных .net — обращение к свойствам анонимного типа
-
03-07-2019 - |
Вопрос
Я привязал GridView ASP.net к коллекции анонимных типов.
Как я могу ссылаться на одно из свойств анонимных типов в обработчике событий RowDataBound?
Я уже знаю, как привести анонимный тип следующим образом:
protected void GridView1_RowDataBound(object sender, GridViewRowEventArgs e)
{
if (e.Row.RowType == DataControlRowType.DataRow)
{
var AnonObj = Cast(e.Row.DataItem,
new { StringProperty = "", BoolProperty = false, IntProperty = 0 });
if (AnonObj.BoolProperty)
{
e.Row.Style.Add(HtmlTextWriterStyle.Color, "Red");
}
}
}
T Cast<T>(object obj, T type)
{
return (T)obj;
}
Я думаю, что большинство скажут, что это беспорядок, хотя это действительно работает.В моем реальном коде у меня более трех свойств, и мне приходилось обновлять код в двух местах каждый раз, когда я добавлял или менял порядок свойств моего анонимного типа.
Есть ли лучший способ сообщить e.Row.DataItem, что у него есть определенное свойство определенного типа, и заставить объект передать мне это значение (помимо создания класса)?
Решение
То, как вы используете (приведенный пример), беспорядочно и очень хрупкий - я Действительно не рекомендуется (если вы добавите свойство или назовете их в другом порядке, оно сломается;и т. д).Лучшим подходом является использование в проекции собственного именованного типа.
Другие советы
Изучите возможность использования отражения.
Пример:
object o = e.Row.DataItem;
Type t = o.GetType();
PropertyInfo pi = t.GetProperty("StringProperty");
if (pi != null && pi.PropertyType == typeof(string))
{
// the property exists!
string s = pi.GetValue(o, null) as string;
// we have the value
// insert your code here
// PROFIT! :)
}
Проверка ошибок и оптимизация оставлены читателю в качестве упражнения.
Лучшим способом было бы создать тип для обработки этого, чтобы вам не приходилось выполнять все это приведение для использования анонимного типа.
То, что я делаю, это...например,
string Name = (string)DataBinder.Eval(dataItem.DataItem, "Name");
...но это в списке ItemDataBound
обработчик события.Подумал, что это может быть кому-то полезно.
Нет, я не верю, что есть лучший способ, чем этот.Ребята из C# на самом деле не поддерживают использование анонимных типов за пределами области локального метода (т.е.здесь у вас есть анонимный тип, прикрепленный к вашему объекту Row.)
Обычно вместо этого предлагается создать настоящий класс.
Метод, который вы используете для приведения анонимного объекта (хоть и очень крутой), является хаком.Это работает просто потому, что компилятор C# достаточно умен, чтобы создать только один экземпляр анонимного класса для всего приложения, если свойства одинаковы.Таким образом, в использовании анонимных типов нет никакой пользы, поскольку класс все равно создается «за кулисами».Да, вы можете взломать это, вы можете использовать отражение, но, серьезно, зачем?Какая польза от использования анонимных типов в этом случае?