动态声明泛型类型实例[重复]

2024-01-19

是否可以在设计时不知道类型的情况下声明泛型的实例?

Example:

Int i = 1;
List<typeof(i)> list = new List<typeof(i)>();

其中 i 的类型可以是任何类型,而不必执行以下操作:

List<int> list = new List<int();

如果您在编译时不知道类型,但您想要实际类型(即不是List<object>) and您不在具有适当类型参数的通用方法/类型中,那么您必须使用反射。

为了使反射更简单,我有时会在自己的代码中引入新的泛型类型或方法,因此我可以通过反射来调用它,但之后只需使用普通的泛型即可。例如:

object x = GetObjectFromSomewhere();
// I want to create a List<?> containing the existing
// object, but strongly typed to the "right" type depending
// on the type of the value of x
MethodInfo method = GetType().GetMethod("BuildListHelper");
method = method.MakeGenericMethod(new Type[] { x.GetType() });
object list = method.Invoke(this, new object[] { x });

// Later

public IList<T> BuildListHelper<T>(T item)
{
    List<T> list = new List<T>();
    list.Add(item);
    return list;
}

当然,如果你不知道类型,你就不能在事后对列表做很多事情……这就是为什么这种事情经常失败的原因。但并非总是如此 - 我在一些场合使用过类似上面的东西,其中类型系统并不能完全让我静态地表达我需要的所有内容。

编辑:请注意,虽然我在上面的代码中调用 Type.GetMethod,但如果您要经常执行它,您可能只想调用它一次 - 毕竟,该方法不会改变。您也许可以将其设为静态(在上面的情况下可以),并且您可能也希望将其设为私有。为了简化示例代码中的 GetMethod 调用,我将其保留为公共实例方法 - 否则您需要指定适当的绑定标志。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

动态声明泛型类型实例[重复] 的相关文章

随机推荐