我想做类似下面代码的事情。
public IList SomeMethod(Type t)
{
List<t> list = new List<t>;
return list;
}
当然,这不起作用。是否有其他方法可以使用对Type实例的引用动态设置泛型类的类型参数?
答案 0 :(得分:7)
试试这个:
public IList SomeMethod(Type t)
{
Type listType = typeof(List<>);
listType = listType.MakeGenericType(new Type[] { t});
return (IList)Activator.CreateInstance(listType);
}
答案 1 :(得分:4)
您必须使用Type.MakeGenericType()
方法和Activator.CreateInstance()
。
生成的代码很丑陋,速度很慢,并且会让您在编译时通常希望捕获的内容出现运行时故障。这些都不是什么大不了的事,但我已经看到最后一个特别关注其他.Net开发人员(他们期望完全类型安全)措手不及。
就个人而言,我从未这样做过。每当我受到诱惑时,我都把它作为我的设计出现问题并回到绘图板的迹象。我没有后悔当然。
答案 2 :(得分:1)
此处没有其他信息,仅适用于那些遵循沙盒代码的内容(我必须全部尝试)
using System;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace ListFromType
{
class Program
{
static void Main(string[] args)
{
var test1 = FlatList(typeof(DateTime));
var test2 = TypedList<DateTime>(typeof(DateTime));
}
public static IList<T> TypedList<T>(Type type)
{
return FlatList(type).Cast<T>().ToList();
}
public static IList FlatList(Type type)
{
var listType = typeof(List<>).MakeGenericType(new Type[] { type });
var list = Activator.CreateInstance(listType);
return (IList) list;
}
}
}
答案 3 :(得分:-1)
你可以尝试做以下,它是通用类型,
public IList SomeMethod<T>(T t)
{
List<T> list = new List<T>();
list.Add(t);
return list;
}