当使用T调用泛型方法时,将List <object>转换为泛型参数T,其类型为List <myclass>

时间:2018-12-21 20:37:11

标签: c# .net generics

在类似public T getList<T>()的通用方法中, 我有一个列表,我需要将其转换为T型以返回它。

public T getList<T>()
{
    List<object> someObjects = getListObject();  // Get object from any where.
    return (dynamic)someObjects;   // Casting don't work
}

我用T将此类型为List<myClass>的方法称为这样:

List<myClass> myClassList = getList<List<myClass>>()

然后我有一个运行时异常,他说我无法将List<object>转换为List<myClass> 很正常,我知道为什么。

但是我该怎么做呢?

我用这种方法尝试过同样的事情:

public List<T> getList<T>()
{
    List<object> someObjects = getListObject();  // Get object from any where.
    return (dynamic)someObjects.OfType<T>.ToList<T>;   // that work good
}  

现在我用T调用此方法的类型为myClass,如下所示:

List<myClass> myClassObjects = getList<myClass>()

效果很好,但是我需要在T类型为List<myClass>的情况下使用此方法

2 个答案:

答案 0 :(得分:0)

我认为您的getList<T>方法定义有点错误。您要返回通用列表。我将您的实现设为静态,但不必如此。 getList<T>方法也可以是实例方法。

希望这是您所需要的:

public class TemplateExamples
{
    public static List<T> getList<T>()
    {
        List<T> someObjects = new List<T>();
        return someObjects;   
    }
}

这是使用它的示例:

public class TestTemplateExamples
{
    public static void Main()
    {
        var intList = TemplateExamples.getList<int>();
        var stringList = TemplateExamples.getList<string>();
        var templateList = TemplateExamples.getList<TemplateExamples>();
    }
}

Thnx

答案 1 :(得分:0)

对于reasons,可以将给定的List<object>分配或强制转换为List<T>,但是您可以将List<object>中的每个元素强制转换为T,如果没有错误,请返回。

但是,您不能轻易获得传入类型的泛型类型参数,因此您需要传入元素类型:

public List<T> getList<T>() {
    List<object> someObjects = getListObject();  // Get object from any where.
    return someObjects.Cast<T>().ToList();
}

这使用LINQ Cast方法强制转换每个元素,并根据结果创建一个新的List<T>

相关问题