更新1:添加了一些示例伪代码,希望更好地尝试和解释 我的目标是什么。
我有一堆实体(Entity1
,Entity2
,Entity3
)和他们的
关联的包装类(Entity1Wrapper
,Entity2Wrapper
,
Entity3Wrapper
),其中包装类都实现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;
}
所以我的问题是:
如果所有实体类都实现了一个空接口(仅仅是
给他们一个共同的基础类型;目前所有都来自object
)?
答案 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;
}