4

我已将 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 它具有特定类型的特定属性并强制对象给我该值(除了创建一个类)?

4

6 回答 6

7

研究使用反射。

例子:

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

错误检查和优化留给读者作为练习。

于 2009-03-03T17:58:11.557 回答
5

更好的方法是创建一个类型来处理这个问题,这样您就不必进行所有转换来使用匿名类型。

于 2009-03-03T17:57:45.240 回答
4

我所做的是......例如,

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

...但这是在 listviewItemDataBound事件处理程序中。认为它可能对某人有用。

于 2009-11-05T10:56:12.423 回答
3

您使用的方式(通过示例进行转换)是混乱且非常脆弱的 - 我真的不推荐它(如果您添加一个属性,或者以不同的顺序命名它们,它会中断;等等)。更好的方法是在投影中使用您自己的命名类型。

于 2009-03-03T18:09:01.640 回答
1

不,我认为没有比这更好的方法了。C# 的人并不真正支持在本地方法范围之外使用匿名类型(即,在这里你有一个匿名类型附加到你的 Row 对象。)

通常的建议是创建一个真正的课程。

于 2009-03-03T17:59:28.887 回答
0

您用来投射匿名对象的方法(虽然很酷)是一种 hack。它之所以起作用,仅仅是因为 C# 编译器足够聪明,如果属性相同,它只会为整个应用程序创建一个匿名类的实例。所以使用匿名类型确实没有任何好处,因为无论如何都是在幕后创建一个类。是的,你可以破解它,你可以使用反射,但严重的是,为什么要麻烦呢?在这种情况下使用匿名类型有什么好处?

于 2009-03-03T18:10:10.563 回答