在C#中访问动态对象中的元素

时间:2015-11-05 13:53:53

标签: c# arrays dynamic type-conversion

我有一个返回dynamic对象的公共函数。这样的dynamic对象实际上是MyObj类型,其中MyObj是包含该函数的类的私有类。

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;
        }
}

现在我需要从中调用此类函数,如下所示:

var c = new MyClass();
var stuff = c.myMethod();

并遍历输出对象的元素,但正如您所见,stuff对象被整形为dynamic(查看函数的返回类型),所以我不知道类型(是私人的)。我该如何探索阵列?

1 个答案:

答案 0 :(得分:1)

我会尝试回答你的问题,虽然你想要达到的目标有点奇怪。

首先:如果此对象的类是私有的,则无法访问动态对象的属性,因为对象的元数据未向您公开。

唯一的方法是使用反射:

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);
}