Привязка данных .net — обращение к свойствам анонимного типа

StackOverflow https://stackoverflow.com/questions/607433

Вопрос

Я привязал 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# достаточно умен, чтобы создать только один экземпляр анонимного класса для всего приложения, если свойства одинаковы.Таким образом, в использовании анонимных типов нет никакой пользы, поскольку класс все равно создается «за кулисами».Да, вы можете взломать это, вы можете использовать отражение, но, серьезно, зачем?Какая польза от использования анонимных типов в этом случае?

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top