【问题标题】:Dynamic return type from library not working库中的动态返回类型不起作用
【发布时间】:2014-10-10 03:13:00
【问题描述】:

我有一个包含方法的库类。

-> 创建一个类库项目并发布此方法。

    public dynamic GetTrainRoute(string trainName)
    {
        //var list = new TrainDbManager().GetTrainRoute(dbConnection, trainName);
        //return list;

        var list = new []{new {TrainName = "Train A", RouteOrder = 1, From = "City A", To = "City B" } }.ToList();
        list.Add(new { TrainName = "Train A", RouteOrder = 2, From = "City B", To = "City C" });
        return list;
    }

我将此库的引用添加到我的控制台项目以及当我调用方法时

-> 现在创建一个空项目,并将库项目的引用添加到新创建的项目中,现在创建该类的实例并调用该方法。

 Manager man = new Manager();
 var list = man.GetTrainRoute("Millat Up");
 string s;
 foreach (var v in list)
     s = v.TrainName; // <- exception throws here

它抛出异常'object'不包含'TrainName'的定义。当我将鼠标悬停在列表上时,它包含列表但是当我尝试检索该值时,它会抛出异常。我在这里做什么。

任何帮助将不胜感激。 谢谢

【问题讨论】:

  • 无法复制。你能发布一个完整的样本来重现这个问题吗?为简洁起见,我在同一个项目中尝试过,这种行为是否仅适用于类库?

标签: c# c#-4.0 dynamic dll


【解决方案1】:

要使此代码正常工作,您应该返回一个动态 (IList&lt;dynamic&gt;) 的列表

但实际上,这里没有理由使用匿名类型和dynamic。您应该创建一个类来保存火车时刻表信息。

此外,如果没有返回结果,您的调用将失败,因为您不能将foreach 超过null。您应该创建一个空列表,然后将其添加到循环中;如果没有结果,返回的列表将为空。您可能还想查看yield return

【讨论】:

  • 我试图避免自己创建过多的课程。这就是我尝试动态的原因。
  • 如果它只包含两个字段我该怎么办。?我也应该为此创建一个类。
【解决方案2】:

我觉得应该提this upfront

不建议使用dynamic 关键字,除非某些情况 互操作性。

不仅如此,而且通过在您提供的代码 sn-p 中使用 dynamic 关键字,几乎没有使用像 c# 这样的强类型语言的好处。

我建议您编写自己的火车类,而不是将其生成为匿名类型:

class Train
{
    public string TrainName { get; set; }
    public int RouteOrder { get; set; }
    public string From { get; set; }
    public string To { get; set; }
}

然后修改您的GetTrainRoute 函数以返回一个类型:

public List<Train> GetTrainRoute(string trainName)
{
    //var list = new TrainDbManager().GetTrainRoute(dbConnection, trainName);
    //return list;
    List<Train> TrainCollection = new List<Train>();
    TrainCollection.Add(new Train() { TrainName = "Train A", RouteOrder = 1, From = "City A", To = "City B" });
    TrainCollection.Add(new Train() { TrainName = "Train A", RouteOrder = 2, From = "City B", To = "City C" });

    return TrainCollection;
}

您的错误现在应该消失了。 :) 问题是混合dynamicanonymous 类型的结果。

【讨论】:

  • 如果它只包含两个字段我该怎么办。?我也应该为此创建一个类。
  • 这取决于你,我个人不按字段计数。我自己写了很多两个字段类。我看数据的可重用性。需要记住的是匿名类型主要用于简化 linq 查询中的投影。
猜你喜欢
  • 2016-02-10
  • 2016-05-30
  • 1970-01-01
  • 2022-12-03
  • 2020-07-23
  • 1970-01-01
  • 2022-10-07
  • 2015-12-19
相关资源
最近更新 更多