如何获取 List<of_anonymous_type> 字段的值(加上转换)?

How to get values of fields of List<of_anonymous_type> (plus casting)?

我有这个代码。最后我们有 List 个匿名对象,其字段为 FILE_NAMEDATEREPORT_LINK.

public ServiceResult Get(string userIdString)
{
    var userId = Int32.Parse(userIdString);
    var downloadLink = _serviceConfigManager.Parameters[ServiceResources.DownloadService].FirstOrDefault();
    var query = SharedUnitOfWork.Context.ReportRequest
        .Where(item => item.IS_DELETED == 0
                    && item.TENANT_ID == TenantId
                    && item.REPORT_STATE_ID == 2
                    && item.CREATED_BY_USER_ID == userId)
        .OrderByDescending(item => item.ID)
        .Take(10)
        .ToList()
        .Select(item => new
            {
                FILE_NAME = item.FILENAME,
                DATE = item.CREATION_DATE,
                REPORT_LINK = string.Format("{0}/{1}", downloadLink, item.ID)
            }
        );
    return new ServiceResult<object>(query.ToList());
}

首先,如您所见,我们 return ServiceResult<object> 反对。 第二,函数的 returning 类型是 ServiceResult(非通用)。 这段代码不是我写的,所以我无法更改此方法的源代码。

任务: 在我的单元测试中,我需要获取 returning 对象并检查它是否填充了正确的数据。 我写了我的测试函数 Get returns 2条记录的方式。 所以,我需要检查这个记录中的每个字段。怎么做?

在我的测试中,我从这个名字为 serviceResult 的函数变量中得到。 如何 "unwrap" serviceResult 使其看起来像 List<of_something> 我可以检查 List<of_something>[0].FILE_NAMEList<of_something>[1].FILE_NAME 等等?

serviceResultResult 字段等于 query.ToList().

致版主:我阅读了所有提供的类似主题,但没有一个描述|解决了我的任务,因为我无法重写 Get 函数的源代码。

你无法掌握匿名类型。您的选择是:

  • 使用反射(GetType().GetProperty()等)读取数据
  • 使用dynamic

后者可能更方便:

foreach(dynamic obj in listOfAnonObjects) {
    string filename = obj.FILE_NAME;
    DateTime date = obj.DATE;
    string link = obj.REPORT_LINK;

    // TODO: now use filename, date and link
}

您可以使用上面的方法将数据投影到您的 自己的 列表类型中,该列表类型具有广为宣传的属性。

使用反射解决了问题。

使用模式targetType.GetType().GetProperty(propertyName).GetValue(targetType,index:optional) 我可以获取任何匿名类型字段的值。

如果是索引器,我使用 GetProperty("Item")GetValue(targetType,new object[]{0}),其中第二个参数需要索引。