如何获取 List<of_anonymous_type> 字段的值(加上转换)?
How to get values of fields of List<of_anonymous_type> (plus casting)?
我有这个代码。最后我们有 List
个匿名对象,其字段为 FILE_NAME
、DATE
、REPORT_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_NAME
、List<of_something>[1].FILE_NAME
等等?
serviceResult
有 Result
字段等于 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})
,其中第二个参数需要索引。
我有这个代码。最后我们有 List
个匿名对象,其字段为 FILE_NAME
、DATE
、REPORT_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_NAME
、List<of_something>[1].FILE_NAME
等等?
serviceResult
有 Result
字段等于 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})
,其中第二个参数需要索引。