首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从基泛型类型转换为派生泛型类型,其中派生类型具有附加的类型约束。

从基泛型类型转换为派生泛型类型,其中派生类型具有附加的类型约束。
EN

Stack Overflow用户
提问于 2022-01-24 19:13:35
回答 2查看 141关注 0票数 0

实际上,当转换是理想的,甚至是"newing up“时,派生类型将在我的特定场景中工作。当我无法访问泛型参数的具体类型时,我怀疑这是不可能的。

代码语言:javascript
复制
public class OrderableCollection<T> : Collection<T> where T : IOrderable, new()
{
...
}

public class ArchivableOrderableCollection<T> : OrderableCollection<T> where T : IOrderable, IArchivable, new()
{
...
}

public class OrderableListDisplay<TItem> where TItem : IOrderable, new()
{
    protected OrderableCollection<TItem> orderableItems { get; set; }

    protected virtual async Task RestoreItem(TItem item)
    {
        if (item is not IArchivable)
        {
            throw new ArgumentException();
        }

        // None of these compile
        var aoc1 = orderableItems as ArchivableOrderableCollection<TItem>;
        var aoc2 = new ArchivableOrderableCollection<TItem>(orderableItems);
        var aoc3 = (ArchivableOrderableCollection<TItem>)(object)(OrderableItems);

        // I think I need something like
        var aoc4 = orderableItems as ArchivableOrderableCollection<TItem> where TItem : IArchivable
    }  
}
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2022-01-24 19:47:58

可以向RestoreItem方法中添加泛型参数w/约束。

代码语言:javascript
复制
protected virtual async Task RestoreItem<T>(T item)
    where T : TItem, IArchivable
{
    if( orderableItems is not ArchivableOrderableCollection<T> items )
    {
        throw new InvalidOperationException();
    }

    // do what you need to here
    items.Restore( item );
}

不过,我认为你应该重新考虑你的设计。为OrderableListDisplay<T>实现基类和派生类,以便派生版本可以适当地将TItem约束为IArchivable,并期望和实现ArchivableOrderableCollection<T>

代码语言:javascript
复制
public class OrderableListDisplay<TItem>
    where TItem : IOrderable, new()
{
    private readonly OrderableCollection<TItem> _items = null;

    public OrderableListDisplay( OrderableCollection<TItem> items )
    {
        _items = items ?? throw new ArgumentNullException( nameof( items ) );
    }
}

public class ArchivableOrderableListDisplay<TItem>
    : OrderableListDisplay<TItem>
    where TItem : IArchivable
{
    private readonly ArchivableOrderableCollection<TItem> _items = null;

    public ArchivableOrderableListDisplay( ArchivableOrderableCollection<TItem> items )
        : base( items )
    {
        _items = items;
    }

    protected async Task RestoreItem( TItem item )
    {
        _items.Restore( item );
    }
}
票数 1
EN

Stack Overflow用户

发布于 2022-01-24 19:51:34

这对我来说很管用

代码语言:javascript
复制
protected virtual async Task RestoreItem<T>(T item)
    where T : TItem, IArchivable
{
    if( orderableItems is not ArchivableOrderableCollection<T> items )
    {
        throw new InvalidOperationException();
    }

   
    items.Restore( item );
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/70839261

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档