【问题标题】:new object inline instantiation新对象内联实例化
【发布时间】:2012-01-20 10:23:19
【问题描述】:

NEWBIE,新手,新手问题,对不起。我刚刚开始用 C# 编程(很久以前来自 C++ 的强类型世界)。重新编程很有趣,但我在 global.asax 文件中看到了将某种无类型对象作为第三和第四个参数的 routes.MapRoute 方法。两者都实例化相同,但可能是两种不同的类型。

route.MapRoute( p1, p2, new { controller = "Home", Action = "Index" }, new {} );

令人惊讶的是,一切正常。但是,我现在想访问帮助程序中的第三个参数,它作为对象类型进入。我将对象类型转换为任何类型的对象都没有任何问题,但我不知道它被实例化为什么(我也找不到任何比对象更多的文档)。同样,它究竟是如何知道如何处理存在于类型化/非类型化对象中的“控制器”之类的?现在我有一个未知的对象类型,里面有未知/变化的属性类型。我猜是var?

正如对编译器所做的这些假设的评论一样,当我看到创建单元测试的示例只是为了确保包含松散类型的内容并正确拼写和键入时,我对松散类型方法的价值失去信心.我错过了什么吗?

【问题讨论】:

    标签: c# asp.net-mvc-3 object types


    【解决方案1】:

    接受某种无类型对象的 routes.MapRoute 方法

    它不是一个无类型的对象;该对象有一个类型,只是它是一个anonymous type

    它到底怎么知道如何处理存在于类型化/非类型化对象中的“控制器”之类的东西?

    它使用reflection检查对象

    但是,我现在想访问帮助程序中的第三个参数,它作为对象类型进入。我将对象类型转换为任何类型的对象都没有任何问题,但我不知道它被实例化为什么

    匿名类型的范围仅限于使用它们的方法。如果您需要在其他地方重用此类型,请使用命名类型而不是匿名类型。

    明确一点:使用匿名类型不会“破坏”强类型。只是在某些情况下您只需要在一个地方使用该类型,因此您不想声明一个只会使用一次的类型。对于MapRoute 方法,使用匿名类型只是为了方便,因为声明匿名类型的实例比手动创建字典(键/值对列表)更容易

    【讨论】:

    • 其实我不确定是否使用了反射。另一个讨论指出,与后期绑定的动态相比,匿名类型是由编译器在编译时生成的。
    • @ShaneC,是的,它们是由编译器生成的。它不会改变 MapRoute 方法不知道实际类型(参数被声明为对象)的事实,因此它可以访问其成员的唯一方法是使用反射。
    • 哇,这是对一个愚蠢问题的快速响应。谢谢!我花了两个小时寻找,从未注意到“匿名”。现在我已经读了一点,如果可能的话,我会避免它。我只是尝试传入一个从具有正确参数的对象派生的类型化对象并且它起作用了。呸!再次感谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-08-04
    • 1970-01-01
    • 2013-06-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多