注意:我的问题与 ASP.Net 无关。
我有一个使用 LINQ 与匿名集合绑定的 GridView。
我希望在网格中的事件处理程序中从绑定对象获取一个值,该对象无法转换为任何静态类型,因为它的类型是匿名的。
为了解决这个问题我使用动态类型来获取值
protected void MyGridView_RowDataBound(object sender, GridViewRowEventArgs e)
{
if (e.Row.RowType == DataControlRowType.DataRow)
{
dynamic dataItem = e.Row.DataItem; // getting the bound object
bool isCurrentEntity = dataItem.IsCurrentEntity;
if (isCurrentEntity)
e.Row.Style.Add(HtmlTextWriterStyle.FontWeight, "Bold");
}
}
我的问题是,在这里使用动态类型是一种不好的做法吗?
是的,我认为这是一种不好的做法。如果您想在代码中的多个位置使用匿名类型,那么将其设为名义类型就足够重要了。记住,动态再次启动编译器,这是一个严重的性能成本,而且它以开发者的便利为代价,换取隐藏用户发现的bug,这是一笔严重的客户关系成本。
Dynamic 的设计目的是使代码already会变得缓慢而脆弱,读起来更愉快。如果您已经要使用反射,或者已经要与旧版 COM 自动化对象对话,那么您就是already我们将进入一个充满缓慢、危险代码的世界。它也可能是易于阅读的缓慢危险的代码。如果你能避免陷入那个世界,那就去做;使用标称类型。
或者,如果您想使用匿名类型and让它静态类型化,使用“cast by example”技巧:
object anon;
void M1()
{
anon = new { X = 123, Y = 456 };
}
void M2()
{
// we want to get anon.X, but it is anonymous. How do we
// trick the compiler into it?
var cast = CastByExample(new { X = 0, Y = 0 }, anon);
int x = cast.X; // gets anon.X!
}
static T CastByExample<T>(T example, object ob) where T : class
{
return (T)ob;
}
偷偷摸摸的,嗯?示例转换技巧使用泛型类型推断来表示“我认为这里的这个对象与这里的这个对象具有相同的匿名类型结构”。
请注意,通过示例进行转换只能在同一个程序集中工作。例如,您不能将在一个程序集中创建的匿名类型转换为在另一个程序集中创建的匿名类型。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)