注意:我的问题与 ASP.Net 无关。
我有一个使用 LINQ 与匿名集合绑定(bind)的 GridView。
我想在网格中的事件处理程序中从绑定(bind)对象中获取一个值,该值不能转换为任何静态类型,因为它的类型是匿名的。
为了解决这个问题我使用了动态类型来获取值
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");
}
}
我的问题是在这里使用动态类型是一种不好的做法吗?
最佳答案
我认为这是一种不好的做法,是的。如果您想在代码中的多个位置使用匿名类型,那么将其设为名义类型就足够重要了。请记住,动态再次启动编译器,这是一个严重的性能成本,并且它以开发人员的便利为代价来换取隐藏错误以供用户发现,这是严重的客户关系成本。
Dynamic 旨在使已经缓慢而脆弱的代码更易于阅读。如果您已经打算使用反射,或者已经打算与遗留 COM 自动化对象对话,那么您已经将进入一个缓慢、危险的代码世界。它也可能是易于阅读的慢速危险代码。如果你能避免进入那个世界,那就去做吧;使用标称类型。
或者,如果您想使用匿名类型并让它成为静态类型,请使用“按示例转换”技巧:
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;
}
偷偷摸摸的,嗯?实例转换技巧使用泛型类型推断来表示“我认为这里的这个对象与这里的这个对象具有相同的匿名类型结构”。
请注意,示例转换仅适用于同一程序集。您不能通过示例将在一个程序集中创建的匿名类型强制转换为在另一个程序集中创建的匿名类型。
关于c# - 使用动态类型从匿名对象中获取值是不好的做法吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5448410/