【问题标题】:Convert dynamic object to IEnumerable Issue将动态对象转换为 IEnumerable 问题
【发布时间】:2018-04-29 07:47:56
【问题描述】:
protected override IEnumerable<dynamic> GetData()
{
    var request = new RestRequest();
    var directoryResponse = client.ExecuteTaskAsync(request).Result;

    dynamic directory = JsonConvert.DeserializeObject<MyDTO>(directoryResponse.Content);

    cachedDirectory = directory;
}

return cachedDirectory;

问题上线

cachedDirectory = directory;

每当它尝试将 dynamic 对象转换为 IEnumerable 类型时。

异常信息:

无法将类型“MyDTO”隐式转换为“System.Collections.Generic.IEnumerable”。存在显式转换(您是否缺少演员表?)

【问题讨论】:

  • 什么是directoryResponse.Content?你为什么返回IEnumerable&lt;dynamic&gt;而不是模型?
  • 那么cachedDirectory的类型是什么?目前尚不清楚您要在这里实现什么,或者MyDTO 是什么。 (另外,你的代码有一个额外的大括号,这使得它很难理解。)你能提供一个minimal reproducible example吗?
  • @StephenMuecke 我要返回,因为它是我必须重写的接口函数,并且我无法更改函数的返回类型,因为它是项目的一部分。 directoryResponse.Content 是 JsonArray
  • 如果您需要更具体的答案,请按照 Daisy Shipton 的建议提供更多详细信息?就像 MyDTO 的样子,directoryResponse.Content 示例等。
  • 从根本上说,您正在获取一个 MyDTO,并且您想要返回一个 IEnumerable&lt;dynamic&gt;。该返回值应该包含什么?您如何期望MyDTO 转换为IEnumerable&lt;dynamic&gt;?您实际上只是想创建一个包含单个条目的序列,还是 DTO 包含一系列项目?

标签: c# .net oop


【解决方案1】:

我不得不做一些假设。

  • 我假设您的 cachedDirectory 对象是 IEnumerable 类型。如果是这种情况,那么很明显它无法在运行时将 MyDTO 对象转换为 IEnumerable 并引发异常。

以下代码会给您错误。我假设你需要枚举。

    public class NewTest
    {
        IEnumerable<dynamic> cachedDirectory;
        public IEnumerable<dynamic> GetData()
        {
            dynamic directory = JsonConvert.DeserializeObject<MyDTO>("{ 'Name' : 'Test'  }");
            cachedDirectory = directory;
            return cachedDirectory;            
        }
    }

    public class MyDTO
    {
        public string Name { get; set; }
    }

// 这就是你的调用方式。 (此代码给出错误)

    NewTest test = new NewTest();
    IEnumerable<dynamic> result = test.GetData();

回答:如果以上是您使用的方式,那么您可以这样做。

public class NewTest
{
    IEnumerable<dynamic> cachedDirectory;
    public IEnumerable<dynamic> GetData()
    {
         var request = new RestRequest();
        var directoryResponse = client.ExecuteTaskAsync(request).Result;
        dynamic directory = JsonConvert.DeserializeObject<IEumerable<MyDTO>>(directoryResponse.Content);            
        return directory;            
    }
}

public class MyDTO
{
    public string Name { get; set; }
}

// 现在这可以工作了。

    NewTest test = new NewTest();
    IEnumerable<dynamic> result = test.GetData();

【讨论】:

  • 也不清楚转换是不可能的(MyDTO 可能实现IEnumerable;错误消息明确指出存在显式转换),这也没有回答问题。跨度>
  • @dotnetstep 你是对的。但是我该如何解决呢?
  • @NicoSchertler 我无能为力。在这个时间点,我已经搜索了很多并且无法实施。希望你能帮我解决这个问题。
  • @HimanshuChawla 如果您解决问题下的 cmets,您获得答案的机会将大大增加。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-12-16
  • 2016-07-24
  • 2012-06-02
  • 2012-05-15
  • 1970-01-01
  • 2016-08-02
  • 1970-01-01
相关资源
最近更新 更多