1

オブジェクトの名前とタイプ、およびメソッド名があります。理想的には、オブジェクトをインスタンス化してメソッドを呼び出したいと思います。これですべて問題ありませんが、結果を処理しようとするとエラーが発生します。

private void GetData(DropDownList ddl)
    {
        ObjectDataSource ods = (ObjectDataSource)ddl.DataSourceObject;
        System.Reflection.Assembly assembly = typeof(ExistingObject).Assembly;

        Type type = assembly.GetType(ods.SelectMethod);
        var instance = Activator.CreateInstance(type);

        IterateCollection(instance, ddl);
    }

    private static void IterateCollection<T>(T instance, DropDownList ddl) 
    {
        ObjectDataSource ods = (ObjectDataSource)ddl.DataSourceObject;
        Type type = instance.GetType();
        MethodInfo methodInfo = type.GetMethod(ods.SelectMethod);

        LinkedList<T> col = (LinkedList<T>)methodInfo.Invoke(null, new object[] { (T)instance });

        foreach (T o in col)
        {
            string textfield = Convert.ToString(GetPropValue(o, ddl.DataTextField));
            string valuefield = Convert.ToString(GetPropValue(o, ddl.DataValueField));
            ListItem li = new ListItem(textfield, valuefield);
            if ((bool?)GetPropValue(o, "Active") != true)
                li.Attributes.CssStyle.Add("background-color", "gray");
            ddl.Items.Add(li);
        }
    }

System.InvalidCastException : Unable to cast object of type 'System.Collections.Generic.LinkedList``1[Business.Objects.MyType]' to type 'System.Collections.Generic.ICollection「Invoke」行に1[System.Object]'というエラーが表示されます 。

コレクションを繰り返し処理できるようにしたいと思います。これどうやってするの?LinkedListなどを作成するにはどうすればよいですか?

ありがとう

4

1 に答える 1

1

タイプTは常に、に格納されている名前ods.SelectMethodと複数のプロパティを持つメソッドを提供する必要があるようです。Tこのメソッドを含むインターフェースを実装する必要がある場合は、以下IterateCollection<T>を使用してそのインターフェースに制約できます。

   private static void IterateCollection<T>(T instance, DropDownList ddl)
       where T: IMyInterface 

それができないと仮定して、を使用しLinkedList<object>ます。リフレクションを使用してメソッドを呼び出しているため、ジェネリックスは構文上の支援を提供しません。

于 2012-09-06T14:48:01.787 に答える