Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用Linq访问另一个对象中的对象属性_C#_Linq - Fatal编程技术网

C# 使用Linq访问另一个对象中的对象属性

C# 使用Linq访问另一个对象中的对象属性,c#,linq,C#,Linq,我需要从另一个对象中的一个对象获取一个值。我的问题是我无法从子对象中访问任何值,我总是获取对象类型本身的值 我访问对象的代码 var test = scheduledTask.Fields.Select(x => x.FieldValue); 这将返回结果视图 [0] 10111 [1] {ObjectType.Extension} 我需要访问[1]元素,该元素包含以下属性(以及其他属性),并且我需要访问DisplayName { DisplayName: "MainMenu", C

我需要从另一个对象中的一个对象获取一个值。我的问题是我无法从子对象中访问任何值,我总是获取对象类型本身的值

我访问对象的代码

var test = scheduledTask.Fields.Select(x => x.FieldValue);
这将返回结果视图

[0] 10111
[1] {ObjectType.Extension} 
我需要访问[1]元素,该元素包含以下属性(以及其他属性),并且我需要访问DisplayName

{
DisplayName: "MainMenu",
CategoryId: -1,
Id: 433
}
ScheduledTask是

{
Fields: {Fields.Field[2]},
LastModifiedDate:null,
{Fields.Field[2]}
}

假设
x.FieldValue
是一个
对象
,您可以尝试强制转换以检查它是否属于类型
ObjectType.Extension

var test=scheduledTask.Fields.Select(x=>{
var asExtension=x.FieldValue作为ObjectType.Extension;
如果(asExtension!=null),则返回asExtension.DisplayName;
否则返回x.FieldValue;
});

ETA:
as
运算符是一种安全强制转换,如果LHS参数的运行时类型与RHS参数标识的静态类型不匹配,它将返回null。

假设
x.FieldValue
是一个
对象
您可以尝试强制转换以检查它是否属于
ObjectType.Extension

var test=scheduledTask.Fields.Select(x=>{
var asExtension=x.FieldValue作为ObjectType.Extension;
如果(asExtension!=null),则返回asExtension.DisplayName;
否则返回x.FieldValue;
});

ETA:as运算符是一种安全强制转换,如果LHS参数的运行时类型与RHS参数标识的静态类型不匹配,它将返回null。

您不需要LINQ来访问数组的特定索引

string name = (scheduledTask.Fields[1].FieldValue as ObjectType.Extension)?.DisplayName;
由于数组包含不同类型的值,我假设我们有一个
object
数组。因此,我们必须强制转换为期望的类型,才能访问特定的字段或属性

如果值为null或类型与
不匹配,as
将生成
null
。空条件运算符
?。
仅在操作数为非空时执行成员或元素访问操作,否则返回
null

如果不知道所需值的索引,可以使用

string name = (scheduledTask.Fields
    .Select(x => x.FieldValue)
    .OfType<ObjectType.Extension>()
    .FirstOrDefault()
)?.DisplayName;
string name=(scheduledTask.Fields
.选择(x=>x.FieldValue)
第()类
.FirstOrDefault()
)?显示名称;

如果您确定所需的值在那里且不为null,则可以删除

您不需要LINQ来访问数组的特定索引

string name = (scheduledTask.Fields[1].FieldValue as ObjectType.Extension)?.DisplayName;
由于数组包含不同类型的值,我假设我们有一个
object
数组。因此,我们必须强制转换为期望的类型,才能访问特定的字段或属性

如果值为null或类型与
不匹配,as
将生成
null
。空条件运算符
?。
仅在操作数为非空时执行成员或元素访问操作,否则返回
null

如果不知道所需值的索引,可以使用

string name = (scheduledTask.Fields
    .Select(x => x.FieldValue)
    .OfType<ObjectType.Extension>()
    .FirstOrDefault()
)?.DisplayName;
string name=(scheduledTask.Fields
.选择(x=>x.FieldValue)
第()类
.FirstOrDefault()
)?显示名称;

如果您确定所需的值存在且不为空,则可以删除

您可以提供有关scheduledTask的一些详细信息吗?它有哪些对象/字段及其设置方式。您可以使用类型的
按所需类型进行筛选并转换为该类型
scheduledTask.Fields.Select(x=>x.FieldValue).OfType().Select(e=>e.DisplayName)
添加了一些详细信息,它基本上只是我从另一个方法获得的一个大对象。@chris如果粘贴了scheduledTask
的任何类型的定义都会更有帮助,运行时/调试器值不是很有帮助。您能提供scheduledTask的一些详细信息吗?它有哪些对象/字段及其设置方式。您可以使用类型的
按所需类型进行筛选并转换为该类型
scheduledTask.Fields.Select(x=>x.FieldValue).OfType().Select(e=>e.DisplayName)
添加了一些细节,它基本上只是我从另一个方法获得的一个大对象。@chris如果粘贴了scheduledTask
的任何类型的定义都会更有帮助,运行时/调试器值不是很有帮助,所以我似乎无法访问。DisplayName,我只有访问FieldValue的选项,它只给了我对象而不是特定属性。好的,我更正了我的答案。如果不了解所涉及的类型是如何声明的,就很难推断出正确的代码。因此,我必须执行以下操作?scheduledTask.Fields[1]。FieldValue.ToEnumerable()。Select(x=>x.GetType().GetProperty(“DisplayName”).GetValue(x))。这将返回正确的字符串,但我正在对元素进行硬编码,它看起来非常糟糕。对于这个含糊不清的问题,我深表歉意。我仍在等待相关类型如何声明。如果我能把这些东西放到我的VisualStudio中,我就能找到一个解决方案。到目前为止,这只是一个猜测。请向我们展示所涉及的类和结构的声明。如果属性是公共的,则不需要使用反射。因此,我似乎无法访问。DisplayName,我只有访问FieldValue的选项,它只提供给我对象而不是特定属性。好的,我更正了我的答案。如果不了解所涉及的类型是如何声明的,就很难推断出正确的代码。因此,我必须执行以下操作?scheduledTask.Fields[1]。FieldValue.ToEnumerable()。Select(x=>x.GetType().GetProperty(“DisplayName”).GetValue(x))。这将返回正确的字符串,但我正在对元素进行硬编码,它看起来非常糟糕。对于这个含糊不清的问题,我深表歉意。我仍在等待相关类型如何声明。如果我能把这些东西放到我的VisualStudio中,我就能找到一个解决方案。到目前为止