我怎样才能让它发挥作用? var x =期望的错误类型或命名空间名称。
class Program
{
static void Main(string[] args)
{
Person j = new John();
var t = j.GetType();
var x = new List<t>();
}
}
class John : Person
{
}
class Person
{
public string Name;
}
答案 0 :(得分:3)
不可能使用这样的泛型。通用类和函数的所有类型参数必须在编译时知道(即它们必须是硬编码的),而在您的情况下,j.GetType()
的结果只能在运行时知道。
泛型旨在提供编译类型的安全性,因此无法解除此限制。它可以在某些情况下解决,例如可以使用类型参数调用泛型方法,该类型参数仅在编译时使用Reflection知道,但如果可能,这通常应该避免。
答案 1 :(得分:3)
你可以这样做,但你必须使用反射来做到这一点。
static void Main(string[] args)
{
Person j = new John();
var t = j.GetType();
Type genType = Type.MakeGenericType(new Type[] { typeof(List<>) });
IList x = (IList) Activator.CreateInstance(genType, t);
}
或者非常简单:
static void Main(string[] args)
{
Type genType = Type.MakeGenericType(new Type[] { typeof(List<>) });
IList x = (IList) Activator.CreateInstance(genType, typeof(John));
}
您需要使用IList Interface,因为您需要将内容添加到列表中
答案 2 :(得分:2)
因为必须在编译时知道泛型。在List<T>
中,T必须是常量类型,例如List<Person>
。