2017-01-17 16 views
0

我有一個類DataHolder,它存儲不同的列表,並且我有一個函數在courses列表被初始化時更新下拉列表。我有不同類型的列表(例如,course,student)以及用於檢查每種類型的不同功能。我想創建一個通用函數,適用於不同類型的列表,並且主要支持是我不確定如何動態地使用字符串在C#中訪問字段名稱。我正在閱讀反思,但似乎無法使其工作。訪問Unity C#類中的字段(不知道如何正確反射)

基本上,我正在尋找一個C#相當於dataHolder[dataType] != null && dataHolder[dataType].length

Reflection

private DataHolder dataHolder; 

void CheckIfCoursesHasBeenPulled (string dataType) { 
    //dataHolder has been initialised in Start function 
    if (dataHolder.courses != null && dataHolder.courses.Count > 0) { 
     UpdateDropdown(dataHolder.courses); 
    } 

    //code that I hope to do but getting error 
    if (dataHolder.GetType().GetField(dataType).GetValue(dataHolder) != null && dataHolder.GetType().GetField(dataType).GetValue(dataHolder).Count > 0) { 
     UpdateDropdown(dataHolder.courses); 
    } 
} 

錯誤消息

Operator ‘>’ cannot be applied to operands of type ‘method group’ and ‘int’ 

回答

0

錯誤說,計數是一種方法。

你可能有這樣的事情:

public int Count() 
{ 
     return 0; 
} 

但是你所期望的是:

public int Count { get { return 0; } } 

所以,你想用一個整數進行比較的方法地址。

1

GetValue返回一個對象;你需要將它轉換爲List或者其他東西才能使用Count。

例如。

using System.Collections.Generic; 

namespace Assets.Foo 
{ 
    public class DataHolder 
    { 
    public List<object> courses; 
    } 

    public class Class1 
    { 
    private DataHolder dataHolder; 

    void CheckIfCoursesHasBeenPulled (string dataType) { 
     //dataHolder has been initialised in Start function 
     if (dataHolder.courses != null && dataHolder.courses.Count > 0) { 
     UpdateDropdown(dataHolder.courses); 
     } 

     // Convert object to object[] or List<Foo> or whatever here... 
     var objects = dataHolder.GetType().GetField(dataType).GetValue(dataHolder) as List<object>; 
     if (objects != null && objects.Count > 0) { 
     UpdateDropdown(dataHolder.courses); 
     } 
    } 

    private void UpdateDropdown(List<object> dataHolderCourses) 
    { 
     throw new System.NotImplementedException(); 
    } 
    } 
} 
+0

謝謝!我試圖運行你的代碼,但'data'似乎顯示爲null,而'dataHolder.courses'有效。還有什麼我應該做的? –

+0

您正在投射錯誤的類型。如果該對象不是Foo的一個實例,則'Foo'返回null。 「課程」是什麼類型?您需要使用'GetValue(...)作爲T',其中T是正確的類型。 – Doug

相關問題