c#动态对象运行时类型检查

c#动态对象运行时类型检查,c#,dynamic,C#,Dynamic,显然,无论getadynamicshing()返回的对象的类型如何,以下内容在c#4.0中都是有效的 如果运行时类型d不包含方法Foo(),则抛出一个 是否有一种简单的方法来确定d上是否存在Foo() 否则,我们就只能在对象上进行老式的反射,或者依赖try-catch。我不确定我喜欢哪种方法 更新:因此我们目前有3个选项: 倒影 捕获异常 希望GetAdDynamicThing()返回您期望它返回的内容 第3个似乎是动态的目标用法,它在。我最初问这个问题的原因是为了回应这样做,即使用一些任意创建

显然,无论getadynamicshing()返回的对象的类型如何,以下内容在c#4.0中都是有效的

如果运行时类型d不包含方法Foo(),则抛出一个

是否有一种简单的方法来确定d上是否存在Foo()

否则,我们就只能在对象上进行老式的反射,或者依赖try-catch。我不确定我喜欢哪种方法

更新:因此我们目前有3个选项:

  • 倒影
  • 捕获异常
  • 希望GetAdDynamicThing()返回您期望它返回的内容

  • 第3个似乎是动态的目标用法,它在。我最初问这个问题的原因是为了回应这样做,即使用一些任意创建的对象的方法。这似乎是使用dynamic的错误情况

    如果现在无法找到答案,我希望他们能找到


    维护噩梦

    如果现在无法找到,我希望他们能找到


    维护噩梦

    动态类型的全部要点是假定成员存在


    如果在调用该方法之前确实需要知道,请使用反射,或者更好地创建一个具体类型,则会实现一个声明
    Foo()
    的接口。我认为,如果您需要检查
    Foo()
    是否是
    dynamic
    类型的成员,那么
    dynamic
    对您来说是错误的选择。听起来您需要静态类型检查。

    动态类型的全部要点是假定成员存在


    如果在调用该方法之前确实需要知道,请使用反射,或者更好地创建一个具体类型,则会实现一个声明
    Foo()
    的接口。我认为,如果您需要检查
    Foo()
    是否是
    dynamic
    类型的成员,那么
    dynamic
    对您来说是错误的选择。听起来您需要静态类型检查。

    如果您的体系结构非常开放,以至于您不知道GetAdDynamicThing返回的是什么,那么您应该捕获异常或以某种方式使用反射。但是,在大多数情况下,您都会很清楚应该得到什么,并且可以做出一些假设。

    如果您的体系结构非常开放,以至于您不知道GetAdDynamicThing将返回什么,那么您应该捕获异常或以某种方式使用反射。但是,在大多数情况下,您将很清楚应该得到什么,并且可以做出一些假设。

    动态类型并不意味着要替换System.Object。如果您不知道返回的是什么,那么在API中使用System.Object或具体接口仍然比使用dynamic更好,即使是在C#4中


    如果您基本上知道返回的内容,那么Dynamic非常有用。您应该将缺少的成员(即:Foo)视为异常情况,在这种情况下,异常是处理此问题的合理方式。

    动态类型并不意味着替换System.Object。如果您不知道返回的是什么,那么在API中使用System.Object或具体接口仍然比使用dynamic更好,即使是在C#4中


    如果您基本上知道返回的内容,那么Dynamic非常有用。您应该将缺少的成员(即:Foo)视为异常情况,在这种情况下,异常是处理此问题的合理方式。

    编译器不会捕捉到这一点。编译器仍然知道d是什么类型。@chollida:不,它不知道。在编译时,它知道类型是动态的。它不知道这在实际类型方面意味着什么,这就是重点。@Chollida,看看他链接的网站,编译器可能不会理解这一点。编译器仍然知道d是什么类型。@chollida:不,它不知道。在编译时,它知道类型是动态的。“它不知道这在实际类型方面意味着什么,这就是重点所在。”乔利达,看看他链接的网站-1的可能副本,我不相信你是对的。动态的全部意义在于,您不一定知道确切的类型,也不需要在编译时知道——它是动态绑定的。如果您确实知道类型,请使用对象和明智的强制转换或类型本身,而不是动态。@Jeff,这种类型的东西让我想起了vb6代码的噩梦。人们会滥用。当然,人们会滥用,就像人们滥用扩展方法、字符串、IDisposable和其他任何语言功能一样。虐待不是不给人们完成工作所需的工具的借口。-1,我不相信你是对的。动态的全部意义在于,您不一定知道确切的类型,也不需要在编译时知道——它是动态绑定的。如果您确实知道类型,请使用对象和明智的强制转换或类型本身,而不是动态。@Jeff,这种类型的东西让我想起了vb6代码的噩梦。人们会滥用。当然,人们会滥用,就像人们滥用扩展方法、字符串、IDisposable和其他任何语言功能一样。虐待不是不给人们完成工作所需的工具的借口。
    dynamic d = GetADynamicThing();
    d.Foo();