我有一个传递IEnumerable<TModel>
的方法。然后,根据TModel
的类型,该方法执行如下的一组指令:
public void MyMethod<TModel>(IEnumerable<TModel> items) where TModel : class
{
int operationType;
switch (typeof(TModel))
{
case typeof(MyModelOne):
operationType = 1;
break;
case typeof(MyModelTwo):
operationType = 2;
break;
case typeof(MyModelThree):
operationType = 3;
break;
default:
throw new Exception("The collection model passed to MyMethod is not recognized");
}
...
}
这不起作用,我收到错误:
没有应用变量或memeber'TModel'
答案 0 :(得分:6)
您无法启用Type
变量。将其替换为级联if
语句。
if (typeof(TModel) == typeof(MyModelOne)) {
operationType = 1;
} else if (typeof(TModel) == typeof(MyModelTwo)) {
operationType = 2;
} // ...
答案 1 :(得分:1)
switch
语句仅适用于常量值,例如字符串,整数和其他基本类型。 Type
不是常量值,因此不能在开关块中使用。
等效操作是if
语句块或使用带有Type
的字典作为键。
答案 2 :(得分:1)
这里的其他答案都是正确的,但您应该退一步看看为什么要这样做。泛型的全部意义在于它们应该是通用的。如果你根据类型做了不同的事情,那么通常的方法可能不是你想要的方法 - 也许重载的方法适合你。
或许您想要接受的类型可以实现相同的接口,您可以基于接口对它们进行调用,而不是手动检查类型。例如:
interface IDoesSomething
{
void DoSomething();
}
void MyMethod<T>(IEnumerable<T> objects)
where T : IDoesSomething
{
foreach (T t in objects)
{
t.DoSomething();
}
}
答案 3 :(得分:0)
对于整数和字符串类型,您只能switch
。在这种情况下,您必须使用if/else
。