繁体   English   中英

通用容器内是什么类型

[英]What type is inside a generic container

public T getValueByName<T>(String name)
{
    if( T is List )
        Object containedType = T.WhatGoesHere()?
...

在上面的代码中,我需要知道是否可以将List转换为传入的任何列表类型,例如List<Control>

有没有办法查询包含类型的泛型? 我可以得到List<Control>List<String>List<Form>等。

我可以将API拆分为在一个单独的方法中返回列表,在该方法中传入包含的类型,因此要求调用者对列表使用一种方法,对简单类型使用一种方法。 无论哪种方式,他们都必须知道返回的结果,但是如果有一种顺利的方式来完成我要问的事情,我宁愿保持API的简单性。

注意:这是解决缺少协方差的一种方法,因为即使在所包含的类型上定义了隐式转换运算符,List到T的强制转换也会失败。 因此,为了遵循解决方案listOfB.Cast<A>(); 从这里开始 ,我需要知道要投射什么(什么是A)。

谢谢!

您可以从typeof(T)以获取表示TSystem.Type的实例。 完成后,可以检查Type.IsGenericType以查看它是否真的是通用的,然后调用Type.GetGenericArguments()来查看使用了哪些通用参数。

例如,如果TList<int> IsGenericTypetrueGetGenericArguments()将返回包含一个元素的数组: System.Int32

例如,这是我编写的代码片段,以查看如果IEnumerable<T>其中T不知道)是否给定类型(变量type )是某种实现。 它首先必须查看它是否是通用的,然后计算出是否只有一个参数,确定所述参数,并在给定该参数的情况下查看它是否实现了接口:

if (type.IsGenericType)
{
    Type[] genericArguments = type.GetGenericArguments();
    if (genericArguments.Length == 1)
    {
        Type proposedEnumerable = typeof(IEnumerable<>).MakeGenericType(genericArguments);
        if (proposedEnumerable.IsAssignableFrom(type))
        {

供参考,请参阅:

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM