【问题标题】:Accessing elements in a dynamic object in C#在 C# 中访问动态对象中的元素
【发布时间】:2015-11-05 13:53:52
【问题描述】:

我有一个返回 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(查看函数的返回类型)所以我不知道类型(是私有的) .如何探索阵列?

【问题讨论】:

  • 什么数组?你有一个列表,但没有一个数组。也许你可以使用stuff.data[0].mystring?那是你要找的吗?为什么你仍然使用动态类型?如果您遵循正常的 .NET 命名约定,它也会极大地帮助您提高问题的可读性。请注意,您只能通过从代码中可以看到MyObj 类型的位置动态键入来访问MyObj 的成员。为什么MyObj 是私有的? (你为什么不直接返回List&lt;myElement&gt;
  • 可以将类型转换为 JObject 或 Dictionary 并循环属性键。
  • @JonSkeet 我正确地重申了这个问题并纠正了拼写错误和语法错误
  • 您没有更正命名约定,也没有为此提供任何动机。我们仍然不知道您从哪里调用 myMethod()(这在您如何使用结果方面有所不同)或者您为什么不直接返回列表。
  • 但是你没有理由想要做这一切,或者首先让嵌套类是私有的。如果您希望调用者看到这些类中的数据,为什么要将它们设为私有?

标签: c# arrays dynamic type-conversion


【解决方案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);
}

【讨论】:

  • 这正是@JonSkeet 所说的:可能只有反射才能做到。所以要么我公开内部类,要么使用反射
猜你喜欢
  • 1970-01-01
  • 2013-06-22
  • 1970-01-01
  • 2021-09-27
  • 2022-12-09
  • 2013-09-06
  • 2010-12-23
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多