2015-11-05 75 views
-1

我有一個公共函數,它返回一個dynamic對象。這樣的dynamic對象實際上是MyObj類型,其中MyObj是包含該函數的類的私有類。訪問C中動態對象中的元素#

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

什麼陣列?你有一個列表,但不是一個數組。也許你可以使用'stuff.data [0] .mystring'?那是你在找什麼?爲什麼你使用動態輸入?如果你遵循正常的.NET命名約定,它也會極大地幫助你的問題的可讀性。請注意,您只能通過從代碼中可以看到「MyObj」類型的地方進行動態輸入來訪問「MyObj」的成員。爲什麼MyObj是私人的? (爲什麼你不只是返回'List '? –

+0

這個類型可以轉換成一個JObject或字典並循環屬性鍵。 –

+0

@JonSkeet我重新正確地重申了這個問題並糾正了錯字和語法錯誤 –

回答

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

這正是@JonSkeet正在談論的:可能只有反思才能做到。所以無論是暴露內部類還是使用反射 –