gpt4 book ai didi

c# - 需要一些帮助在两个 .NET 实例之间进行转换

转载 作者:太空宇宙 更新时间:2023-11-03 10:48:33 25 4
gpt4 key购买 nike

我在尝试将一个实例转换为另一种实例类型时遇到问题。我认为,通过继承,这应该可以正常工作。

这是错误信息。 (抱歉,它很难阅读 - 在新标签页中打开它)

enter image description here

这是上下文。

public interface IItem { ... }

public class AuctionItem : IItem { ... }

public class BuyNowItem : IItem { ... }

public class SearchResult<T> where T : IItem
{
public IList<T> Items { get; set; }
public int TotalCount { get; set; }
}

所以我们有 2 个具体类,它们都实现了 IItem接口(interface)和包含 IItems 列表的结果类.

现在,我们如何使用它?我们定义一个搜索接口(interface)...

public interface ISearchService<T, in TU>
where T : IItem
where TU : ISearchOptions
{
string Name { get; }
Task<SearchResult<T>> SearchAsync(TU searchOptions);
}

所以在这里我们可以看到我们可以搜索一些东西(例如 eBay),它会返回一些结果(例如 IItems)。

我该如何实现?现在,我有一个看起来像这样的疯狂方法......

public class FooSearchService<T, TU> : ISearchService<T, TU>
where T : AuctionItem, new()
where TU : AuctionSearchOptions
{
public async Task<SearchResult<T>> SearchAsync(TU searchOptions) { .. }
}

到目前为止似乎工作正常......

直到我现在尝试这个....

<my console app .. and yes, i'm not awaiting this call, etc...>
private SearchResult<IItem> DoSearches(Notification notification)
{
if (ebay)
{
var searchResult = _ebaySearchService.SearchAsync(auctionSearchOptions);
return searchResult.Result; // ** COMPILE ERROR HERE
}
else if (somethingElse_eg_BuyNow_1)
{
...
return buyNowSearchResult.Result;
}
}

看看我在做什么?我想说的是:搜索 ebay 并返回 AuctionItem搜索结果。或者尝试其他服务并返回他们的 BuyNowItem的...

我认为,因为 ebay 返回一个 SearchResult<AuctionItem> , 调用方法想要返回一个 SearchResut<IItem>哪个AuctionItem实现,所以我认为它会没问题。但它不是:(

谁能提供任何帮助?

更新

现在几乎可以正常工作了:)@jdphenix 的回答基本上可以正常工作。唯一的问题是我试图返回 Task<..>那是行不通的。这是错误消息..

enter image description here

最佳答案

public interface IItem { }

public class AuctionItem : IItem { }

public class BuyNowItem : IItem { }

public interface IResult<out T> where T : IItem {
IList<IItem> Items { get; set; }
int TotalCount { get; set; }
}

public class SearchResult<T> : IResult<T> where T : IItem
{
public IList<IItem> Items { get; set; }
public int TotalCount { get; set; }
}

您无法退回 SearchResult<AuctionItem>来自 DoSearches()因为那样这将是可能的:

List<BuyNowItem> items = new List<SearchResult<BuyNowItem>>();
items.Add(DoSearches()); // Could be a SeachResult<AuctionItem>

接口(interface)是什么IResult做什么?

  • <out T>声明任何实现 IResult 的类型会有T作为输出。因此,您可以执行类似 IResult<IItem> result = DoSearches() 的操作它是有效的。
  • IList<IItem>而不是 IList<T>因为编译器无法证明每个 T将是 IItem 的类型安全转换.对此进行更全面的解释需要比我更专业的人。

一个新的DoSearches()在概念上可能是这样的:

private IResult<IItem> DoSearches(Notification notification) {
var searchresult = _ebaySearchService.SearchAsync(auctionSearchOptions);
return searchresult;
}

关于c# - 需要一些帮助在两个 .NET 实例之间进行转换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22444555/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com