C#获取IEnumerable的类型<tmodel> </tmodel>

时间:2010-05-21 13:44:41

标签: c# generics collections types

我有一个传递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'

4 个答案:

答案 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