使用动态类型转换为集合

时间:2011-08-07 07:33:22

标签: c# reflection

如何动态设置通用类型?

 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 个答案:

答案 0 :(得分:3)

要在“常规”c#中执行操作,您将使用反射来获取MethodInfo,然后使用MakeGenericMethod()和Invoke()。但是,这更容易:

Foo((dynamic)testObj);

这里的反思方法是:

var method = typeof(Class1).GetMethod("Foo").MakeGenericMethod(argType);
method.Invoke(this, new object[] { testObj });

答案 1 :(得分:0)

你不能这样做,因为在Foo函数中你应该对集合做一些事情,而且不能保证这种类型是安全的。

唯一的方法是使用“对象”,然后在Fooo函数中强制转换为正确的类型。