【问题标题】:How object with members that are not specified in class be created?如何创建具有未在类中指定的成员的对象?
【发布时间】:2016-03-09 08:16:27
【问题描述】:

下图显示了RouteCollectionExtensions.Maproute方法的MSDN参考。

该方法有 1 个名为 defaults 的参数,它是一个 object 类型。

下图显示了 Visual Studio 中的 ASP.NET MVC 项目中的一行代码(盒装),其中不包含错误。

代码创建一个新对象并将其作为参数传递给MapRoute 方法。 该对象包含成员controlleractionid

但是,该对象是从System.Object 类创建的。 System.Object 类中没有指定此类成员。

由于没有具有这些成员的类,如何创建对象?

【问题讨论】:

    标签: c# asp.net-mvc class oop object


    【解决方案1】:

    您需要在这里了解各种不同的想法。

    最重要的是,有anonymous type 的想法。看看这个:

    var x = new { Name = "Jon", Location = "Reading" };
    

    创建了一个匿名类型的实例,并将结果引用分配给变量x。在编译时,编译器会生成一个实际上有名字但你不能引用的类型。

    现在在这种情况下,x 将被强类型化为“未命名”类型 - 但也可以使用:

    object x = new { Name = "Jon", Location = "Reading" };
    

    毕竟,我们只是在创建一个对象,而每个类类型都与object兼容,就像我们可以这样写:

    object x = new StringBuilder();
    

    您给出的示例代码非常相似,只是它使用值作为方法调用的参数,而不是将其分配给变量。

    MapRoute 方法使用反射来确定匿名类型的属性以及传入的实例中存储的值。

    【讨论】:

      【解决方案2】:

      这样创建的对象;

      new { foo="bar", id=7 }
      

      实际上有一个类型,但它是由编译器生成的。它被称为anonymous type。但它仍然具有属性,您仍然可以使用反射来查看这些属性。例如;

      new { foo="bar"}.GetType().GetProperties()
      

      将返回一个数组,其中包含一个 PropertyInfo 对象,代表“foo”。

      MapRoutes 方法中,参数被声明为object,但这意味着它可以接受任何东西。在这种情况下,它会获取您的匿名对象。所以 MVC 使用反射来告诉你发送给它的属性。

      【讨论】:

        【解决方案3】:

        它使用匿名类型,这在 c# 中是受支持的。该类型由编译器稍后创建。

        Anonymous Types (C# Programming Guide) from MSDN

        【讨论】:

          猜你喜欢
          • 2021-11-13
          • 1970-01-01
          • 2019-02-19
          • 2021-12-18
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2021-07-25
          • 1970-01-01
          相关资源
          最近更新 更多