【问题标题】:Anonymous type as method parameter匿名类型作为方法参数
【发布时间】:2015-11-12 23:44:09
【问题描述】:

我第一次尝试使用匿名类型(测试):

    private void button4_Click(object sender, EventArgs e)
    {
        test(new { a = "asd" });
    }

    private void test(string a)
    {
    }

我收到一个错误“无法从 'AnonymousType#1' 转换为 'string'”

如果参数是字符串[],我也想知道如何传递匿名类型

    private void test(string[] a)
    {
    }

提前致谢!

【问题讨论】:

    标签: c# .net anonymous-types


    【解决方案1】:

    您的设计有问题。如果您的测试函数只接受字符串,那么您永远不能将匿名类型传递给它,就像您不能传递 int、object 或任何其他非字符串类型一样。

    【讨论】:

      【解决方案2】:

      a 是匿名类型的字符串属性

      private void button4_Click(object sender, EventArgs e)
      {
          test((new { a = "asd" }).a);
      }
      
      private void test(string a)
      {
      }
      

      编辑:匿名类型不派生自对象以外的任何东西,因此您无法创建需要匿名类型参数的方法。

      编辑 2:当您创建匿名类型时,编译器会根据您设置的属性和它们出现的顺序创建一个全新的类型。您不能创建匿名类型并使用它来代替任何其他类型(对象除外)。我使用它们的最常见场景是在您需要展平对象图时进行绑定。

      警告,我很难想出很好的示例场景,这一切都来自记忆! 例如,如果我有一个 Person 对象列表,该列表具有 name 属性和 address 属性,其中包含街道地址并需要绑定到列表框

      var people = new List<Person>()
      listbox.TextMember = "Text";
      listbox.ValueMember = "Value"
      listbox.DataSource = from p in people 
      select new { Text = p.Name, Value = p.Address.StreetAddress };
      

      【讨论】:

      • @Venr,感谢您的更新!您似乎是唯一仍在查看此问题的人。我从上面的答案中了解到,void“test”中的参数应该是对象。所以我有一个参数 - 对象。我想将一个字符串 [] 数组传递给它使用匿名类型,如何?
      • @John,如果你有一个将字符串数组作为参数的方法,则传递给它一个字符串数组。您不会为此创建匿名类型,通常您创建匿名类型是因为您需要自定义属性容器。但只是为了论证,要么定义你的匿名类型以包含一个 string[] 属性,要么用你的匿名类型的 string 属性构造一个新的 string[] 并将其传递给方法。
      【解决方案3】:

      在方法之间传递匿名类型没有干净的方法;你不应该这样做。而是创建一个真实类型。

      如果您真的想这样做,您可以使用辅助方法来笨拙地伪造它,方法是创建另一个该类型的“模板”以便稍后转换;请参阅this 和许多类似的文章。

      编辑:仔细检查后,您似乎并不了解匿名类型实际上是什么,因此我建议您采用其他答案。

      【讨论】:

      • 其实,我不想接受你的回答,告诉我使用匿名类型应该是什么样子。
      • 约翰,查看 mquander 帖子中的链接。
      • 好吧,我知道参数应该是对象,但是如何从对象中取出字符串[]?
      【解决方案4】:

      刚刚偶然发现这个过时的问题,并认为这里有人应该提到从 C# 4.0 开始使用 dynamic 的可能性,这非常适合处理匿名类型。 IE。代码可能如下所示:

      private void button4_Click(object sender, EventArgs e)
      {
          test(new { a = "asd" });
      }
      
      private void test(dynamic obj)
      {
          Console.WriteLine(obj.a);
      }
      

      【讨论】:

        【解决方案5】:

        这很糟糕,但它有效......

        namespace AnonType
        {
            class Program
            {
                static void Main(string[] args)
                {
                    var foo = new { a = "123", b = "abc" };
        
                    Anon(foo);
                    Console.ReadLine();
                }
        
                public static void Anon(object o)
                {
                    Console.WriteLine(o);
                }
            }
        }
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2013-02-19
          • 1970-01-01
          • 2010-11-03
          • 2015-03-30
          • 1970-01-01
          • 2012-01-11
          • 2018-05-16
          相关资源
          最近更新 更多