2017-01-17 3 views
0

私は、異なるリストを格納するクラスDataHolderを持っています。coursesリストが初期化されている場合、ドロップダウンリストを更新する関数があります。さまざまなタイプのリスト(例:coursestudent)と、それぞれのタイプを確認するさまざまな機能があります。私は、リストのさまざまな種類のために働くジェネリック関数を作成したいと思いますが、主には、C#で文字列を使って動的にフィールド名にアクセスする方法がわかりません。私は反射で読んでいたが、それを働かせるように見えなかった。Unity C#クラスのフィールドへのアクセス

基本的には、私はdataHolder[dataType] != null && dataHolder[dataType].lengthのC#と同等のものを探しています。

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はオブジェクトを返します。 Countを使用するには、Listか何かにキャストする必要があります。

例えば、

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

ありがとうございました!私はあなたのコードを実行しようとしていますが、 'objects'は' dataHolder.courses'が有効な間にヌルとして表示されているようです。私は何かしなければならないことがありますか? –

+0

あなたは間違ったタイプにキャストしようとしています。オブジェクトがFooのインスタンスでない場合、 'as Foo'はnullを返します。 「科目」はどのようなタイプですか? Tが正しい型である場合、GetValue(...)をTとして使用する必要があります。 – Doug

関連する問題