Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/296.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在泛型方法中实例化包装器对象_C#_Generics - Fatal编程技术网

C# 在泛型方法中实例化包装器对象

C# 在泛型方法中实例化包装器对象,c#,generics,C#,Generics,更新1:添加了一些示例伪代码,希望能够更好地尝试和解释 我的目标是什么 我有一组实体(Entity1,Entity2,Entity3)及其 关联的包装类(Entity1Wrapper,Entity2Wrapper, Entity3Wrapper),其中包装类都实现了IWrapped: 因此,我的问题是: 这可以吗 我走的路对吗 我该怎么做呢 如果所有实体类都实现了一个空接口(只是为了 为它们指定一个公共基类型;当前所有类型都派生自对象)?您可以为每个类型创建一个方法,并在私有方法中创建公共代码:

更新1:添加了一些示例伪代码,希望能够更好地尝试和解释 我的目标是什么

我有一组实体(
Entity1
Entity2
Entity3
)及其 关联的包装类(
Entity1Wrapper
Entity2Wrapper
Entity3Wrapper
),其中包装类都实现了
IWrapped

因此,我的问题是:

  • 这可以吗
  • 我走的路对吗
  • 我该怎么做呢
  • 如果所有实体类都实现了一个空接口(只是为了
    为它们指定一个公共基类型;当前所有类型都派生自
    对象
    )?

    您可以为每个类型创建一个方法,并在私有方法中创建公共代码:

    public IList<IWrapped<Entity1>> GetAllEntity1()
    {
        return GetAll<Entity1>.Select(e => new Entity1Wrapper(e)).ToList();
    }
    
    public IList<IWrapped<Entity2>> GetAllEntity2()
    {
        return GetAll<Entity1>.Select(e => new Entity2Wrapper(e)).ToList();
    }
    
    //...
    
    private IList<T> GetAll<T>()
    {
        //Get IList<T> entityList by querying
        return entityList;
    }
    
    public IList GetAllEntity1()
    {
    返回GetAll.Select(e=>newentity1wrapper(e)).ToList();
    }
    公共IList GetAllEntity2()
    {
    返回GetAll.Select(e=>newentity2wrapper(e)).ToList();
    }
    //...
    私有IList GetAll()
    {
    //通过查询获取IList entityList
    返回实体列表;
    }
    

    或者,您可以使用IoC注册实现并在需要时注入它们。

    您可以编写一个
    GetWrapper
    静态函数来为类型T返回适当的wrapper create函数。以下函数将为Entity1、Entity2、,和Entity3,以及尚未配置的任何其他类型的错误

    public static class GetWrapper<T>
    {
        static GetWrapper()
        {
            GetWrapper<Entity1>.CreateWrapper = v => new Entity1Wrapper(v);
            GetWrapper<Entity2>.CreateWrapper = v => new Entity2Wrapper(v);
            GetWrapper<Entity3>.CreateWrapper = v => new Entity3Wrapper(v);
        }
        public static Func<T, IWrapped<T>> CreateWrapper { get; set; }
    }
    
    public IList<IWrapped<T>> GetAll<T>()
    {
        IList<IWrapped<T>> retList = new List<IWrapped<T>>();
    
        //Get IList<T> entityList by querying
        IList<T> entityList = new List<T> { default(T) };
    
        var createWrapper = GetWrapper<T>.CreateWrapper;
        if (createWrapper == null)
        {
            throw new Exception("Wrapper not found for type " + typeof(T).Name);
        }
    
        foreach (T elem in entityList)
        {
            retList.Add(createWrapper(elem));
        }
        return retList;
    }
    
    公共静态类GetWrapper
    {
    静态GetWrapper()
    {
    GetWrapper.CreateWrapper=v=>newEntity1Wrapper(v);
    GetWrapper.CreateWrapper=v=>newentity2wrapper(v);
    GetWrapper.CreateWrapper=v=>newentity3wrapper(v);
    }
    公共静态Func CreateWrapper{get;set;}
    }
    公共IList GetAll()
    {
    IList retList=新列表();
    //通过查询获取IList entityList
    IList entityList=新列表{default(T)};
    var createWrapper=GetWrapper.createWrapper;
    if(createWrapper==null)
    {
    抛出新异常(“找不到类型“+typeof(T).Name”的包装器);
    }
    foreach(实体列表中的元素)
    {
    添加(createWrapper(elem));
    }
    返回列表;
    }
    
    如果
    T
    Entity1
    ,我几乎看不出在
    IList@Guillaume如果
    T
    Entity1
    ,我想将其存储在
    Entity1Wrapper
    中:
    entityList.Add(newentiy1wrapper(elem))
    。当然,这个伪代码实际上不起作用,但这正是我想要的。
    public IList<IWrapped<Entity1>> GetAllEntity1()
    {
        return GetAll<Entity1>.Select(e => new Entity1Wrapper(e)).ToList();
    }
    
    public IList<IWrapped<Entity2>> GetAllEntity2()
    {
        return GetAll<Entity1>.Select(e => new Entity2Wrapper(e)).ToList();
    }
    
    //...
    
    private IList<T> GetAll<T>()
    {
        //Get IList<T> entityList by querying
        return entityList;
    }
    
    public static class GetWrapper<T>
    {
        static GetWrapper()
        {
            GetWrapper<Entity1>.CreateWrapper = v => new Entity1Wrapper(v);
            GetWrapper<Entity2>.CreateWrapper = v => new Entity2Wrapper(v);
            GetWrapper<Entity3>.CreateWrapper = v => new Entity3Wrapper(v);
        }
        public static Func<T, IWrapped<T>> CreateWrapper { get; set; }
    }
    
    public IList<IWrapped<T>> GetAll<T>()
    {
        IList<IWrapped<T>> retList = new List<IWrapped<T>>();
    
        //Get IList<T> entityList by querying
        IList<T> entityList = new List<T> { default(T) };
    
        var createWrapper = GetWrapper<T>.CreateWrapper;
        if (createWrapper == null)
        {
            throw new Exception("Wrapper not found for type " + typeof(T).Name);
        }
    
        foreach (T elem in entityList)
        {
            retList.Add(createWrapper(elem));
        }
        return retList;
    }