.net Привязка данных - ссылка на свойства анонимного типа - PullRequest
4 голосов
/ 03 марта 2009

Я связал ASP.net GridView с коллекцией анонимных типов.

Как я могу ссылаться на одно из свойств анонимных типов в обработчике событий 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;
}

Я думаю, что большинство скажет, что это грязно, хотя и работает. В моем реальном коде у меня более 3 свойств, и мне придется обновлять код в двух местах каждый раз, когда я добавляю или изменяю порядок свойств моего анонимного типа.

Есть ли лучший способ сообщить e.Row.DataItem, что он обладает определенным свойством определенного типа, и заставить объект присвоить мне это значение (помимо создания класса)?

Ответы [ 6 ]

7 голосов
/ 03 марта 2009

Изучите использование отражения.

Пример:

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!  :)
}

Проверка ошибок и оптимизация оставлены читателю в качестве упражнения.

5 голосов
/ 03 марта 2009

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

4 голосов
/ 05 ноября 2009

Что я делаю ... например,

string Name = (string)DataBinder.Eval(dataItem.DataItem, "Name");

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

3 голосов
/ 03 марта 2009

То, как вы используете (приведение в качестве примера), грязное и очень хрупкое - я действительно не рекомендую его (если вы добавляете свойство или называете их в другой порядок, он сломается и т. д.). Лучше всего использовать свой собственный именованный тип в проекции.

1 голос
/ 03 марта 2009

Нет, я не верю, что есть лучший способ, чем этот. Парни из C # на самом деле не поддерживают использование анонимных типов вне локальной области метода (т. Е. Здесь у вас есть анонимный тип, присоединенный к вашему объекту Row.)

Обычное предложение - создать реальный класс.

0 голосов
/ 03 марта 2009

Метод, который вы используете для приведения анонимного объекта (хотя и очень крутой), является хаком. Он работает просто потому, что компилятор C # достаточно умен, чтобы создать только один экземпляр анонимного класса для всего приложения, если свойства совпадают. Так что использование анонимных типов на самом деле бесполезно, так как класс все равно создается за кулисами. Да, вы можете взломать его, вы можете использовать отражение, но серьезно, зачем? Какая польза от использования анонимных типов в этом случае?

...