库中的动态返回类型不起作用

时间:2014-08-16 18:01:16

标签: c# c#-4.0 dynamic dll

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

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

    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

enter image description here

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

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

2 个答案:

答案 0 :(得分:0)

要使此代码生效,您应该返回动态(IList<dynamic>)的列表

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

此外,如果未返回任何结果,您的通话将失败,因为您无法foreach超过null。您应该创建一个空列表,然后在循环中添加它;如果没有结果,则返回的列表将为空。您可能还想查看yield return

答案 1 :(得分:0)

我觉得我应该提到this upfront

  

除特定情况外,不建议使用dynamic关键字   interop senerios。

不仅如此,通过在您提供的代码段中使用动态关键字,几乎失去了使用强类型语言(如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类型的结果。