【问题标题】:Need to Convert List<T> to List<someClass> and Back需要将 List<T> 转换为 List<someClass> 并返回
【发布时间】:2016-03-11 20:33:23
【问题描述】:

我有一个分配给 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&lt;SomeClass&gt; var,然后以某种方式将其通过data 转换为该类,将特定类型的 List 类型传递给我的方法,然后将其转换回泛型,如果这甚至可能的话。我不认为这很重要,但是助手只需要列表中项目的一个子集。

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

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

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

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

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

【问题讨论】:

  • 如果你正在使用 autommaper 和实体框架,你应该使用它的 QueryableExtensions 并使用它的 ProjectTo( 方法,而不是 Mapper.Map
  • @ScottChamberlain 赞成好的建议,但这是一个 mongoDb 调用。我在其他地方使用了 QueryableExtension(通过 EF 访问 SQL 时),这很有帮助。
  • 我不明白这个案子。你有一个辅助方法接收和返回List&lt;SomeClass&gt;?
  • @IvanStoev:假设我缺少一些基本的 C# 概念,因为这可能就是正在发生的事情。问题是我不能(据我所知)确保“数据”是具体类型,但我需要将数据传递给助手并使用它,然后返回 List 或返回 List 并将其转换为 List.
  • @IvanStoev:如果我可以将 List 传递给采用 List 并返回 List 的方法,我也很高兴。

标签: c# generics


【解决方案1】:

看来您正在寻找一个简单的演员表。

假设辅助方法是

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

那么你可以这样称呼它

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

【讨论】:

  • 问题是我最初需要做这样的事情'List dataInMyFormat = (List)data;',这是行不通的。我不能只将 LIst 传递给采用 List 的东西。同样,我可能遗漏了一些非常明显的东西。
  • 在泛型方法中这不是一个好的做法,但是强制转换应该可以。看,你有一个List&lt;T&gt;,但实际上你的TSomeClass(你知道这是因为你正在使用is 运算符进行检查),所以实际列表的类型是List&lt;SomeClass&gt;,即你可以安全地将List&lt;T&gt; 转换为List&lt;SomeClass&gt;,反之亦然。需要强制转换才能使编译器满意。
  • 我有一个愚蠢的错字导致问题,我无法让您的解决方案工作一段时间(由于我的错误)。您的回答确实有效,谢谢。
【解决方案2】:

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

最干净的方法是从方法中返回您的List&lt;T&gt;,并让调用者在调用它之后执行它需要的任何其他操作。

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

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> */)

【讨论】:

    猜你喜欢
    • 2020-06-01
    • 1970-01-01
    • 2021-11-26
    • 2019-05-20
    • 1970-01-01
    • 1970-01-01
    • 2012-02-14
    相关资源
    最近更新 更多