在 C# 中访问动态对象中的元素
Accessing elements in a dynamic object in C#
我有一个 public 函数,它 return 是一个 dynamic
对象。这样的 dynamic
对象实际上是 MyObj
类型,其中 MyObj
是包含函数的 class 的私有 class。
public class MyClass
{
private class MyElement
{
public string myString{ get; set; }
}
private class MyObj
{
public List<MyElement> data { get; set; }
}
public dynamic myMethod()
{
List<MyElement> myList = (some complex code here).ToList();
var myObj = new MyObj{ data = myList };
return myObj;
}
}
现在我需要从 在 class 之外调用此类函数,如下所示:
var c = new MyClass();
var stuff = c.myMethod();
并遍历输出对象的元素,但如您所见,stuff
对象的形状为 dynamic
(查看函数的 return 类型),所以我不知道类型(是私有的)。我怎样才能探索阵列?
我会尽量回答你的问题,尽管你想要达到的目标有点奇怪。
第一件事:如果此对象的 class 是私有的,则您无法访问动态对象的属性,因为对象的元数据未向您公开。
唯一的办法就是使用反射:
var myClass = new MyClass();
var stuff = myClass.myMethod();
var dynamicType = (TypeInfo)stuff.GetType();
var dataProperty = dynamicType.GetProperty("data");
var data = (IEnumerable)dataProperty.GetValue(stuff);
var result = new List<string>();
Type itemType = null;
PropertyInfo myProperty = null;
foreach(var item in data){
if(itemType == null){
itemType = item.GetType();
myProperty = itemType.GetProperty("myString");
}
var content = (string)myProperty.GetValue(item);
result.Add(content);
}
我有一个 public 函数,它 return 是一个 dynamic
对象。这样的 dynamic
对象实际上是 MyObj
类型,其中 MyObj
是包含函数的 class 的私有 class。
public class MyClass
{
private class MyElement
{
public string myString{ get; set; }
}
private class MyObj
{
public List<MyElement> data { get; set; }
}
public dynamic myMethod()
{
List<MyElement> myList = (some complex code here).ToList();
var myObj = new MyObj{ data = myList };
return myObj;
}
}
现在我需要从 在 class 之外调用此类函数,如下所示:
var c = new MyClass();
var stuff = c.myMethod();
并遍历输出对象的元素,但如您所见,stuff
对象的形状为 dynamic
(查看函数的 return 类型),所以我不知道类型(是私有的)。我怎样才能探索阵列?
我会尽量回答你的问题,尽管你想要达到的目标有点奇怪。
第一件事:如果此对象的 class 是私有的,则您无法访问动态对象的属性,因为对象的元数据未向您公开。
唯一的办法就是使用反射:
var myClass = new MyClass();
var stuff = myClass.myMethod();
var dynamicType = (TypeInfo)stuff.GetType();
var dataProperty = dynamicType.GetProperty("data");
var data = (IEnumerable)dataProperty.GetValue(stuff);
var result = new List<string>();
Type itemType = null;
PropertyInfo myProperty = null;
foreach(var item in data){
if(itemType == null){
itemType = item.GetType();
myProperty = itemType.GetProperty("myString");
}
var content = (string)myProperty.GetValue(item);
result.Add(content);
}