• 如何声明,它返回的“东西”的泛型集合的方法(C#)

  • 本文关于 c#,泛型generics,collections,contravariance
  • CodeGo.net > 如何声明,它返回的“东西”的泛型集合的方法(C#)
  •  

    如何声明,它返回的“东西”的泛型集合的方法(C#)



    c# 泛型generics collections contravariance
    我是从一个抽象基类派生来存储实体的项目,也从一个抽象基类派生泛型集合类的层次结构:
    abstract class ItemBase { }
    class MyItem : ItemBase
    {
     public MyItem()
     {
     }
    }
    
    abstract class CollectionBase<T> : Collection<T> where T : ItemBase, new() { }
    class MyCollection : CollectionBase<MyItem> { }
    
    这种模式的目的是强制执行strict的类型纪律上的任何类从CollectionBase <T>而得并保证有一个默认的公共构造函数。目前它的工作原理。 现在我想创建一个返回从CollectionBase <T>派生的类的实例。据我所知,做法是:
    public CollectionBase<T> CreateCollection<T>();
    
    ...也许...
    public T Create CreateCollection<T>();
    
    然而,问题在于,调用例程不知道什么是“T”型是必需的。它是一个必须确定集合的特定类型来返回本身。所以我需要一个非签名,上面写着“返回类型将获得从CollectionBase <T>”。我设想这样的(如果它是合法的)...
    public CollectionBase<> CreateCollection();
    
    我这是另一个那些棘手的通用方差问题,但即使在关于这个问题的阅读埃里克利珀广泛的解释 CodeGo.net,我仍然不清楚是否有什么我试图做的很可能是可行的在C#4.0,以及是否有一个简单的解决方法在C#3.0。 预先感谢您的想法。
    本文地址 :CodeGo.net/1482711/
    -------------------------------------------------------------------------------------------------------------------------
    1.比方说,正在创造一个单一的项目。你会:
    public ItemBase CreateItem();
    
    你有ItemBase你可以不知道什么更具体。应用该原则,向您可以获得:
    public CollectionBase<ItemBase> CreateCollection();
    
    由于缺乏变异,你需要它源于一个adapter类CollectionBase<ItemBase>和包被创建的实际集合。 在C#4.0中,您将只返回实际的集合。 编辑:工厂可能是这样的,嵌入式adapter:
    public class CollectionFactory
    {
     public CollectionBase<ItemBase> CreateCollection()
     {
      if(someCondition)
      {
       return CreateAdapter(new MyCollection());
      }
      else
      {
       return CreateAdapter(new MyOtherCollection());
      }
     }
     private static CollectionAdapter<T> CreateAdapter<T>(CollectionBase<T> collection) where T : ItemBase, new()
     {
      return new CollectionAdapter<T>(collection);
     }
     private class CollectionAdapter<T> : CollectionBase<ItemBase> where T : ItemBase, new()
     {
      private CollectionBase<T> _collection;
      internal CollectionAdapter(CollectionBase<T> collection)
      {
       _collection = collection;
      }
      // Implement CollectionBase API by passing through to _collection
     }
    }
    

    2. 也许你需要的是:
    public CollectionBase<Object> CreateCollection();
    
    由于每类直接或间接继承自Object类。
    3. 我还没有真正做到这一点,并且道歉 CodeGo.net,如果它是完全幼稚,但...
    public CollectionBase<Object> CreateCollection();
    

    4. 如果你真的希望它是什么,你可以只返回的ICollection,然后你可以调用.Cast<ItemBase>()因为他们需要。 从我的理解,英寸NET 4.0中,你就可以返回CollectionBase<ItemBase>,但我还没有尝试过在Beta版呢。
    本文标题 :如何声明,它返回的“东西”的泛型集合的方法(C#)
    本文地址 :CodeGo.net/1482711/
    1. (1-2/15)^3.5的 3.5次方 怎么写
    2. MVC在c#中取胜。申请表格
    3. 文章沉,关于C# tcp服务器不稳定报错,详细错误信息和图片都有帮助
    4. C#中:发送从非活动窗口输入
    5. sql:where gno in (@gno) 提示:输入字符串的格式不正确
    6. C#源代码搜索
    7. 类或方法的提示说明
    8. 在执行一个新的进程的静态方法
    9. 我用时间作为一个配置文件的文件名格式是:
    10. SelectlistItem选中=真问题

     
    

    Copyright © 2017 CodeGo.net
    http://codego.net/xinwen/ 足球比分网 足球比分 医药招商网 邵阳县新闻