在泛型方法中实例化Wrapper对象

时间:2015-05-22 09:27:47

标签: c# generics

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

我有一堆实体(Entity1Entity2Entity3)和他们的 关联的包装类(Entity1WrapperEntity2WrapperEntity3Wrapper),其中包装类都实现IWrapped<T>

public interface IWrapped<T>
{
    T GetWrapped();
}

现在在一个通用方法中,我运行一个查询并获得List个实体对象。一世 想要在返回列表之前将它们包装在合适的包装类中。 基本上我希望我的方法声明为:

public IList<IWrapped<T>> GetAll<T>()
{
    IList<IWrapped<T>> retList = new List<IWrapped<T>>();

    //Get IList<T> entityList by querying

    foreach (T elem in entityList)
    {
        if (typeof(elem) == typeof(Entity1))
        {
            //Of course this code doesn't actually work, but the equivalent
            //of this is what I am trying to achieve
            retList.Add(new Entity1Wrapper(elem))
        }
        else if (typeof(elem) == typeof(Entity2))
            //instantiate Entity2Wrapper and store reference to elem in it
        else if (typeof(elem) == typeof(Entity3))
            //instantiate Entity3Wrapper and store reference to elem in it
    }
    return retList;
}

所以我的问题是:

  1. 这可以吗?
  2. 我走向正确的道路吗?
  3. 我如何实际执行此操作
  4. 如果所有实体类都实现了一个空接口(仅仅是 给他们一个共同的基础类型;目前所有都来自object)?

2 个答案:

答案 0 :(得分:1)

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

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;
}

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

答案 1 :(得分:1)

您可以编写一个GetWrapper<T>静态函数来返回类型T的相应包装器创建函数。以下函数将为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;
}