如何将动态转换为列表<;动态>;

本文关键字:动态 gt lt 列表 转换 | 更新日期: 2023-09-27 18:26:16

我有一个变量泳道属性:

List<dynamic> swimlaneAttributes = new List<dynamic>();

但在一个函数中,我有一个返回类型的动态

public dynamic GetSwimlaneAttribute(List<ProjectSwimlaneAttribute> swimlaneAttributeTable, Dictionary<string, string> dic)
    {
        dynamic swimlaneAttributes = null;
        swimlaneAttributes = swimlaneAttributeTable.Select(s => new
        {
            ID = s.Id,
            DataType = s.AttributeDataType,
            IsCriticalField = s.IsCriticalField,
        });
        return swimlaneAttributes;
    }

这将从我正在传递的表参数中返回一些记录!!

现在我必须调用这个GetSwimlaneAttribute函数,作为回报,我将获得所有必需的记录(从表中)但当我把这个传给swimlaneAttributes时,它就去抓块了!!!

swimlaneAttributes = GetSwimlaneAttribute();

如果我这样通过,(我认为记录计数变为0)

//swimalneAttributes = GetSwimlaneAttribute as List<dynamic>;

那么如何将动态转换为列表

谢谢!

如何将动态转换为列表<;动态>;

您当前正在返回一系列匿名类型的对象。该序列不能强制转换为List<T>,因为它不是List<T>

您可以将声明更改为:

IEnumerable<dynamic> GetSwimlaneAttribute(...)

在不对代码主体进行更改的情况下,要获得List<dynamic>,只需将其称为:

List<dynamic> list = GetSwimlaneAttribute(...).ToList();

如果你绝对不能更改声明,你可以在方法之外进行转换:

IEnumerable<dynamic> sequence = GetSwimlaneAttribute(...);
List<dynamic> list = sequence.ToList();

或者直接调用扩展方法:

List<dynamic> list = Enumerable.ToList<dynamic>(GetSwimlaneAttirbute(...));

但是,您应该注意,匿名类型不会跨越程序集边界(没有一点技巧)。您应该强烈考虑为此创建一个名为的类型。

此外,您的方法体有点粗糙——您声明一个变量并为其分配一个null值,然后立即分配一个不同的值,然后只返回该值。整个事情可以写成:

return swimlaneAttributeTable.Select(s => new
{
    ID = s.Id,
    DataType = s.AttributeDataType,
    IsCriticalField = s.IsCriticalField,
});

这个怎么样?

  List<dynamic> lstDynamic = new List<dynamic>();
  lstDynamic.Add(GetSwimlaneAttribute());

并使用lstDynamic。

为什么不试试这种方法?

public List<dynamic> GetSwimlaneAttribute(List<ProjectSwimlaneAttribute> swimlaneAttributeTable, Dictionary<string, string> dic)
{
    List<dynamic> swimlaneAttributes = new List<dynamic>(); // modified dynamic to List<dynamic>
    swimlaneAttributes = swimlaneAttributeTable.Select(s => new
    {
        ID = s.Id,
        DataType = s.AttributeDataType,
        IsCriticalField = s.IsCriticalField,
    });
    return swimlaneAttributes;
}