gpt4 book ai didi

c# - 我如何根据参数的类型做不同的事情(不使用反射)?

转载 作者:太空宇宙 更新时间:2023-11-03 20:56:48 27 4
gpt4 key购买 nike

我有一个接受通用类型的函数,我希望能够根据该类型将某些计算结果分配给不同的列表。我宁愿不使用反射,因为我了解到这并不是最佳实践。

这是我目前所拥有的要点:

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

但是,我认为这不是最好的方法,因为它依赖于运行时计算的反射。有没有办法使用接口(interface)或多态性来做到这一点?

另一种方法是将其拆分为三个函数,让 Type1Type2Type3 实现三个不同的接口(interface),然后添加一个where TEntity : IType1where TEntity: IType2where TEntity: IType3 位于三个函数标题之后。

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

最佳答案

根据你的描述,没有太多选择

  • 制作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
}
}

关于c# - 我如何根据参数的类型做不同的事情(不使用反射)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49684007/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com