如何创建未在类中指定的成员的对象?

时间:2015-12-04 11:44:13

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

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

该方法有一个名为默认值的参数,它是对象类型。

MSDN Reference

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

enter image description here

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

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

如何创建对象,因为它没有包含这些成员的类?

3 个答案:

答案 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#支持。该类型由编译器稍后创建。

请参阅Anonymous Types (C# Programming Guide) from MSDN