如何根据参数的类型(不使用反射)执行不同的操作?

时间:2018-04-06 01:42:41

标签: c#

我有一个接受泛型类型的函数,我希望能够根据该类型将某些计算的结果分配给不同的列表。我宁愿不使用反思,因为我已经知道它并不是最佳实践。

这是我到目前为止的要点:

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

但是,我不认为这是最好的方式,因为它依赖于运行时计算的反射。有没有办法使用接口或多态?

另一种方法是将其拆分为三个函数,让Type1Type2Type3实现三个不同的接口,然后添加where TEntity : IType1,{{1并且,where TEntity: IType2跟随三个功能标题中的每一个。

这似乎也不对。任何帮助将不胜感激。

3 个答案:

答案 0 :(得分:4)

您描述的内容并没有太多选择

  • 制作3种方法
  • 使用IF
  • 使用模式匹配
  • 使用反射,虽然我不确定为什么
  • 您也可以使用开关

示例

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 matchingis关键字一起使用:

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()

Dictionary of generic lists or varying types

List<Object> vs List<dynamic>