需要将List <t>转换为List <someclass>并返回

时间:2016-03-11 20:33:24

标签: c# generics

我有一个分配给var data的通用列表。此列表的类型取决于以前的代码,我需要从控制器返回泛型类型。似乎我不能拥有take a generic List的外部方法。

List<T> data = await queriedItems
        .Project(x => Mapper.Map<BsonDocument, T>(x)).ToListAsync();

if (data.GetType() == typeof(List<SomeClass>))
{
    data = someHelper.HelperMethodChangeData(data);
}

我该如何处理?我正在考虑创建一个新的List<SomeClass> var,然后以某种方式将它转换为data到该类,将特定类型的List类型传递给我的方法,然后将其转换回泛型,如果是&# 39;甚至可能。我不认为这很重要,但帮助者只需要列表中的一部分项目。

编辑 - 添加辅助签名尝试采用泛型:

public List<T> HelperMethodSignature<T>(List<T> itemsList)

编辑 - 以及下面的原始助手签名:

public List<someClass> HelperMethodSignature(List<someClass> itemsList)

我排除了一堆不相关的参数。

2 个答案:

答案 0 :(得分:1)

好像你正在寻找一个简单的演员。

假设辅助方法是

public List<SomeClass> HelperMethodChangeData(List<SomeClass> data)

然后你可以这样称呼它

if (data is List<SomeClass>)
{
    data = (List<T>)someHelper.HelperMethodChangeData((List<SomeClass>)data);
}

答案 1 :(得分:1)

答案是你不这样做。通用方法中的代码不应该关心T实际上是什么类型。调用者知道T实际上是什么类型,因此将该责任推回调用者以处理任何进一步的类型特定更改。

最干净的方法是从方法中返回List<T>并让调用者在调用它之后执行所需的任何其他操作。

假设这是不可能的,您可能只想让调用者参与处理修改的委托。

public void ChangeList<T>(Action<List<T>> modifyList)
{
    var data = // get your data
    modifyList(data);

    // Do some more stuff
}

来电者仍然保留这一责任。

ChangeList<SomeClass>(data => /* do something with your List<SomeClass> */)