【问题标题】:Unknown C# type未知的 C# 类型
【发布时间】:2015-10-08 14:55:27
【问题描述】:

我有一个方法 exMethod 以这种方式返回值:

return new {name = name, surname = surname};

我使用这个代码

var person = exMethod();

但此时我如何才能访问其字段?我试过了

person.name

但是抛出异常

'object' does not contain a definition for 'name'

【问题讨论】:

  • 你的方法签名是什么样的,我猜是public object exMethod(...)。尝试将object 更改为dynamic
  • 发布exMethod的完整实现。你只是说return new { stuff },而不是return new Person(){ stuff };,所以当它分配给person时,它可能不知道如何处理返回的值

标签: c# .net var


【解决方案1】:

匿名类型不能通过方法的边界而不丢失它们的类型(它们将恢复为object)。因为你不能施放它,所以你被卡住了。

您必须创建一个类型以将其公开给创建方法的外部。 (我不想提及dynamic 作为解决方案)

【讨论】:

  • 如果您不想提及 ****** 作为解决方案,那您为什么要提及它?
  • 是的,但是你怎么理解我? @Servy
  • 我没有提到它作为解决方案,它只是我回答中的一个随机词。
  • 提及它比根本不提及它更有可能被使用。
  • @davidinho 它允许在编译时调用任何东西,即使属性不存在于可以调用的对象上。然后这些问题在运行时出现,这是不好的。
【解决方案2】:

你可以这样做

dynamic person = exMethod();

但不推荐,它是“简单的出路”,那时您不会有任何编译时错误。另一种解决方案可能是使用反射,但这可能很繁重。

最好(最安全、最佳实践)的想法可能是创建一个类来定义要返回的类型

class Foo {
    public string name {get;set;}
    public string surname{get;set;}
}

return new Foo(){ name = name, surname = surname }

那么你就可以使用这些属性了

【讨论】:

    【解决方案3】:

    如果你对exMethod有控制权,修改为Patrick suggests

    如果您不这样做并且必须接受它作为Object,请使用dynamic 而不是var

    dynamic person = exMethod();
    person.name;
    

    答案毫无价值,cmets 很好,尤其是@Servy 的:

    匿名类是内部的,因此如果它位于您无权访问的 API 中,那么 dynamic 将无法工作。只有当您可以控制方法的实现时,它才是一种选择。

    【讨论】:

    • 除非你真的需要,否则不要使用dynamic
    • @PatrickHofman 我认为值得一提(即使您不想提及)。我同意这必须有一个很好的理由。如果有这样的理由,那么这个解决方案不仅是正确的,而且是必需的dynamic 可以使用(需要时)。
    • 我希望投反对票的人快乐。这在某些情况下很有用,仅仅因为可能有其他解决方案而投反对票是“不聪明”。
    • 我会说动态很少被认为是“必需的”,在这种情况下肯定不是
    • @Amit Anonymous 类是内部的,因此如果它位于您无权访问的 API 中,那么 dynamic 将无法工作。当您可以控制方法的实现时,它是一个选项。
    猜你喜欢
    • 2018-10-27
    • 1970-01-01
    • 1970-01-01
    • 2017-07-13
    • 2013-09-25
    • 1970-01-01
    • 2011-07-25
    • 1970-01-01
    相关资源
    最近更新 更多