我在C#中有一个方法,它接收泛型类型作为参数:
private void DoSomething<T>(T param)
{
//...
}
我需要执行不同的操作,具体取决于param
的类型。我知道我可以使用几个if
个句子实现它,如下所示:
private void DoSomething<T>(T param)
{
if (param is TypeA)
{
// do something specific to TypeA case
} else if (param is TypeB)
{
// do something specific to TypeB case
} else if ( ... )
{
...
}
// ... more code to run no matter the type of param
}
有更好的方法吗?也许使用switch-case
或其他我不知道的方法?
答案 0 :(得分:5)
只使用重载而不是泛型。
答案 1 :(得分:3)
如果项目/逻辑结构允许将DoSomething移动到T并用IDoSomething接口描述它会很好。这样你就可以写:
private void DoSomething<T>(T param) where T:IDoSomething
{
param.DoSomething()
}
如果那不是一个选项,那么你可以设置规则字典
var actionsByType = new Dictionary<Type, Action<T /*if you neeed that param*/>(){
{ Type1, DoSomething1 },
{ Type2, DoSomething2 },
/..
}
在您的方法中,您可以致电:
private void DoSomething<T>(T param){
//some checks if needed
actionsByType[typeof(T)](param/*if param needed*/);
}
答案 2 :(得分:2)
您可以为特定类型创建特定方法。
{{1}}
答案 3 :(得分:1)
如前所述,如果它的简单案例使用重载。任何陌生的东西你都可以适应这种情况(它的快速和肮脏的道歉)。
class Program
{
interface IDoSomething<T>
{
void DoSomething(T param);
}
class Test : IDoSomething<int>, IDoSomething<string>
{
public void DoSomething(int param)
{
}
public void DoSomething(string param)
{
}
}
static void Main(string[] args)
{
DoSomething(4);
}
static void DoSomething<T>(T param)
{
var test = new Test();
var cast = test as IDoSomething<T>;
if (cast == null) throw new Exception("Unhandled type");
cast.DoSomething(param);
}
}