下面的图片显示了RouteCollectionExtensions.Maproute
方法的MSDN参考。
该方法有一个名为默认值的参数,它是对象类型。
下面的图片显示了Visual Studio中ASP.NET MVC项目中的一行代码(装箱),但不包含错误。
代码创建一个新对象并将其作为参数传递给MapRoute
方法。
该对象包含成员controller
,action
和id
。
但是,该对象是从System.Object
类创建的。 System.Object类中没有指定此类成员。
如何创建对象,因为它没有包含这些成员的类?
答案 0 :(得分:7)
您需要了解各种不同的想法。
最重要的是,有一个anonymous type的想法。看看这个:
var x = new { Name = "Jon", Location = "Reading" };
已创建匿名类型的实例,并将结果引用分配给变量x
。在编译时,编译器将生成一个实际上具有名称但不能引用的类型的类型。
现在在这种情况下,x
将被强类型化为“未命名”类型 - 但它也可以使用:
object x = new { Name = "Jon", Location = "Reading" };
毕竟,我们只是创建一个对象,每个类类型都与object
兼容,就像我们写的一样:
object x = new StringBuilder();
您给出的示例代码非常相似,只是它使用值作为方法调用的参数,而不是将其赋值给变量。
MapRoute
方法使用反射来确定匿名类型的属性以及传入的实例中存储的值。
答案 1 :(得分:2)
像这样创建的对象;
new { foo="bar", id=7 }
实际上有一个类型,但它是由编译器生成的类型。它被称为anonymous type。但它仍然具有属性,您仍然可以使用反射来查看这些属性。例如;
new { foo="bar"}.GetType().GetProperties()
将返回一个包含一个PropertyInfo对象的数组,表示" foo"。
在MapRoutes
方法中,参数声明为object
,但这意味着它可以使用任何。在这种情况下,它会带你的匿名对象。所以MVC使用反射来说明你发送给它的属性。
答案 2 :(得分:0)
它使用匿名类型,c#支持。该类型由编译器稍后创建。