使用匿名对象+动态是不明智的吗?

时间:2013-07-09 14:24:29

标签: c# .net-4.0

我有一个类,其中一个属性返回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)
        });
    }

除了强类型类型的明显丢失之外,有什么理由我不应该这样做吗?

2 个答案:

答案 0 :(得分:3)

如你所说,不这样做的主要原因是你已经失去了静态类型。还有与之相关的性能成本,但它们不如此代码在可读性和可维护性方面的显着问题重要。

如果事实证明你拼错了变量名或错误输入了变量名,那么你就不会进行编译时检查(如果没有代码完成支持,它会更容易)。在编译时,您也没有任何有效的方法可以知道您给出的List<object>中可能存在哪些变量。跟踪该列表的来源以确定可以使用哪些变量变得非常重要。

在这种情况下,创建新的命名类型而不是使用匿名类型几乎肯定值得花时间和精力。创建新课程的前期成本几乎总是有所回报。

答案 1 :(得分:1)

除了类型安全损失&amp;已经指出的其他问题,我觉得在这里使用dynamic是完全错误的。

dynamic的一般用例是用于消费来自外部资源的数据,例如API / COM等基本上没有明确定义信息类型的情况。在您的方案中,您可以控制您要求的数据,并且您知道所期望的数据的类型,因此我无法证明为什么您希望将其用于获得的好处。一个明确定义的,类型安全的模型。

  

使用匿名对象+动态是不明智的吗?

在你的场景中,我会说是的。