Приведение в коллекцию с динамическим типом - PullRequest
4 голосов
/ 07 августа 2011

Как я могу установить универсальный тип динамически?

 public class A
    {
        public int X { get; set; }

        public A()
        {
            X = 9000;
        }
    }

    public class Class1
    {

        public void Test()
        {
            List<A> theList = new List<A>() {
                new A { X = 1 },
                new A { X = 2 }               
            };


            object testObj = theList;
            var argType = testObj.GetType().GetGenericArguments()[0];


            Foo(testObj as ICollection<argType>); // ?                                           

        }

        public void Foo<T>(ICollection<T> items) where T:new()
        {
            T newItem = new T();    
            items.Add(newItem);    

        }

Ответы [ 2 ]

3 голосов
/ 07 августа 2011

Чтобы сделать в "обычном" c # вы бы использовали отражение, чтобы получить MethodInfo, затем используйте MakeGenericMethod () и Invoke (). Однако это проще:

Foo((dynamic)testObj);

Подход отражения здесь:

var method = typeof(Class1).GetMethod("Foo").MakeGenericMethod(argType);
method.Invoke(this, new object[] { testObj });
0 голосов
/ 07 августа 2011

Вы не можете этого сделать, потому что в функции Foo вы должны что-то делать с коллекцией, и нет гарантии, что тип будет безопасным.

Единственный способ - использовать объект"затем приведение к нужному типу в функции Fooo.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...