我有一个类,其中一个属性返回List<object>
。在该列表中,我放了一组匿名对象。
然后,我有一个循环使用该属性的项作为动态变量。
所以我的代码看起来像这样:
private List<object> BookerTypes
{
get
{
if (this.bookerTypes == null)
{
this.bookerTypes = new List<object>();
var com = new SqlConnection(functions.ConnectionString).CreateCommand();
com.CommandText = @"
SELECT
BT.id
, BT.name
FROM dbo.BookerTypes AS BT
ORDER BY BT.name ASC
";
com.Connection.Open();
try
{
using (var dr = com.ExecuteReader())
{
while (dr.Read())
{
this.bookerTypes.Add(new { id = dr.GetInt32(0), name = dr.GetString(1) });
}
}
}
finally
{
com.Connection.Close();
}
}
return this.bookerTypes;
}
}
[...]
this.cblSBT.Items.Clear();
foreach(dynamic bt in this.BookerTypes)
{
this.cblSBT.Items.Add(new ListItem()
{
Value = bt.id.ToString()
, Text = bt.name
, Selected = this.competition.SubscriptionTypes.Contains((int)bt.id)
});
}
除了强类型类型的明显丢失之外,有什么理由我不应该这样做吗?
答案 0 :(得分:3)
如你所说,不这样做的主要原因是你已经失去了静态类型。还有与之相关的性能成本,但它们不如此代码在可读性和可维护性方面的显着问题重要。
如果事实证明你拼错了变量名或错误输入了变量名,那么你就不会进行编译时检查(如果没有代码完成支持,它会更容易)。在编译时,您也没有任何有效的方法可以知道您给出的List<object>
中可能存在哪些变量。跟踪该列表的来源以确定可以使用哪些变量变得非常重要。
在这种情况下,创建新的命名类型而不是使用匿名类型几乎肯定值得花时间和精力。创建新课程的前期成本几乎总是有所回报。
答案 1 :(得分:1)
除了类型安全损失&amp;已经指出的其他问题,我觉得在这里使用dynamic
是完全错误的。
dynamic
的一般用例是用于消费来自外部资源的数据,例如API / COM等基本上没有明确定义信息类型的情况。在您的方案中,您可以控制您要求的数据,并且您知道所期望的数据的类型,因此我无法证明为什么您希望将其用于获得的好处。一个明确定义的,类型安全的模型。
使用匿名对象+动态是不明智的吗?
在你的场景中,我会说是的。