Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/330.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用匿名对象+;动态_C#_.net 4.0 - Fatal编程技术网

C# 使用匿名对象+;动态

C# 使用匿名对象+;动态,c#,.net-4.0,C#,.net 4.0,我有一个类,其中一个属性返回一个列表。在这个列表中,我放置了一组匿名对象 之后,我有一个循环,使用该属性的项作为动态变量。 因此我的代码如下所示: private List<object> BookerTypes { get { if (this.bookerTypes == null) { this.bookerTypes = new List<object>(); var

我有一个类,其中一个属性返回一个
列表
。在这个列表中,我放置了一组匿名对象

之后,我有一个循环,使用该属性的项作为动态变量。
因此我的代码如下所示:

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;
    }
}

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

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

如果结果是拼写错误或键入错误的变量名,则无法进行编译时检查(并且在没有代码完成支持的情况下更容易进行检查)。在编译时,您也没有任何有效的方法来知道
列表中可能存在哪些变量。追踪该列表的来源以找出可能存在哪些变量可供使用,这将成为一项非常重要的任务


在这种情况下,创建新的命名类型而不是使用匿名类型几乎肯定是值得的。创建新类的前期成本很小,实际上总是会有回报的。

不这样做的主要原因是,正如您所说,您已经丢失了静态键入。还有与之相关的性能成本,但它们没有此代码在可读性和可维护性方面的明显问题那么重要

如果结果是拼写错误或键入错误的变量名,则无法进行编译时检查(并且在没有代码完成支持的情况下更容易进行检查)。在编译时,您也没有任何有效的方法来知道
列表中可能存在哪些变量。追踪该列表的来源以找出可能存在哪些变量可供使用,这将成为一项非常重要的任务


在这种情况下,创建新的命名类型而不是使用匿名类型几乎肯定是值得的。创建新类的前期成本很小,实际上总是会有回报的。

除了已经指出的类型安全损失和其他问题之外,我觉得在这里使用
动态
是完全错误的

dynamic
的一般用例用于从外部来源(如API/COM等)使用数据。基本上,在信息类型尚未明确定义的情况下。在您的场景中,您可以控制需要什么数据,并且您知道需要什么类型的数据,因此我无法真正证明您为什么要使用它,而不是使用一个明确定义的类型安全模型所带来的好处

使用匿名对象+动态是否不明智


在你的情况下,我会说是的。

除了已经指出的类型安全损失和其他问题之外,我觉得在这里使用
动态
是完全错误的

dynamic
的一般用例用于从外部来源(如API/COM等)使用数据。基本上,在信息类型尚未明确定义的情况下。在您的场景中,您可以控制需要什么数据,并且您知道需要什么类型的数据,因此我无法真正证明您为什么要使用它,而不是使用一个明确定义的类型安全模型所带来的好处

使用匿名对象+动态是否不明智


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

想象一下从另一个开发人员那里继承您的代码,您必须搜索以确定实际的类型是什么。想象一下从另一个开发人员那里继承您的代码,您必须搜索以确定实际的类型是什么is@James然后,请随意发布另一个答案,说明,如果有什么问题的话,您会觉得给定的代码有问题。我正在写一个答案,但您基本上已经涵盖了我所关心的问题-类型安全性的丧失以及一般使用
dynamic
的缺点(简单的拼写错误等)。我只是补充一点,我不认为可读性会丢失,因为属性等都清晰可见。@James哦,我明白了。这是一个可读性问题,因为作为一名读者,很难确定程序是否正确。在运行时之前不会注意到命名错误,这是一个不容低估的问题,谢谢你提醒我,我显然需要它。@James然后,请随意发布另一个答案,说明什么,如果有的话,您觉得给定的代码有问题。我正在写答案,但您已经大致涵盖了我所关心的问题-类型安全性的丧失&通常使用
dynamic
的脆弱性(简单的拼写错误等)。我只是补充一点,我不认为可读性会丢失,因为属性等都清晰可见。@James哦,我明白了。这是一个可读性问题,因为作为一个读者,很难确定程序是否正确。在运行时之前不会注意到命名错误,这是一个不容低估的问题,感谢您提供我显然需要的提醒。匿名类型是fum!:这要看情况而定。当您在使用它的代码上方几行“生成”一些真正特定的数据时,您实际上获得了时间(否则我们将永远不会使用匿名类)。在这种情况下,有更多的“几”行,所以这次我不使用dynamic+anonymous。@Serge是的,我同意在类型安全性不重要的情况下,它对于临时存储很有用。匿名类型是fum!:这要看情况而定。当您在使用它的代码上方几行“生成”一些真正特定的数据时,您实际上获得了时间(否则我们将永远不会使用匿名类)。在这种情况下,有更多的“几”行,所以这次我不使用dynamic+anonymous。@Serge是的,我同意这对临时的
    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)
        });
    }