我有一个接受泛型类型的函数,我希望能够根据该类型将某些计算的结果分配给不同的列表。我宁愿不使用反思,因为我已经知道它并不是最佳实践。
这是我到目前为止的要点:
private List<int> List1 = new List<int>();
private List<int> List2 = new List<int>();
private List<int> List3 = new List<int>();
public int SomeFunction<TModel, TEntity>(DbSet<TEntity> context) where TEntity : class where TModel : SuperModel
{
// TEntity could be one of three types: Type1, Type2, or Type3
// If TEntity is of Type1, I want to be able to add something to List1.
// If TEntity is of Type2, I want to be able to add something to List2. And so on.
/* One way to do it */
// ... do some function stuff calculation here...
var result = ...
Type entity_type = typeof(TEntity)
if (entity_type == typeof(Type1))
List1.Add(result);
else if (entity_type == typeof(Type2))
List2.Add(result);
else if (entity_type == typeof(Type3))
List3.Add(result);
}
但是,我不认为这是最好的方式,因为它依赖于运行时计算的反射。有没有办法使用接口或多态?
另一种方法是将其拆分为三个函数,让Type1
,Type2
,Type3
实现三个不同的接口,然后添加where TEntity : IType1
,{{1并且,where TEntity: IType2
跟随三个功能标题中的每一个。
这似乎也不对。任何帮助将不胜感激。
答案 0 :(得分:4)
您描述的内容并没有太多选择
示例强>
switch typeof(e) {
case int: ... break;
case string: ... break;
case double: ... break;
default: ... break;
}
或者你可以使类通用
public class SomeClass<T> where T : something
{
private List<T> List3 = new List<T>();
public int SomeFunction<TModel, T>(DbSet<T> context)
{
// do stuff
}
}
答案 1 :(得分:0)
您可以将pattern matching与is
关键字一起使用:
if (context is DbSet<Type1>)
答案 2 :(得分:0)
你可以使用字典
字典&lt;类型,动态&gt; d(custom_equality_comp)
D. [ENTITY_TYPE]。新增(结果)
暂时没有使用过c#,但这值得一试。 您在构造函数中初始化字典,然后从那里开始。 引用。
Efficiency of using IEqualityComparer in Dictionary vs HashCode and Equals()