如何动态设置通用类型?
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);
}
答案 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函数中强制转换为正确的类型。