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