将T转换为IList

时间:2011-09-01 11:14:59

标签: c# generics

我有一个类似下面的通用方法。我检查incomming参数是IList但是如何将参数转换为IList?

public T myMethod<T>(T parameter)
{
    //check if the parameter is a list
    if (parameter IList && parameter.GetType().IsGenericType)
    {
       //How can I convert my parameter to an IList that supports IEnumerable interface?
       // So i can do the following
       foreach (var listObject in parameter)
       {
           // Do stuff
       }
    }
}

5 个答案:

答案 0 :(得分:5)

是的,Marnix的答案是正确的,你需要一个地方,或者为什么你需要一个通用类型T?

但是,这里有5种不同的可能性。

可能性1:

    public void xxx<T>(IList<T> parameter)
    {
        foreach (var listObject in parameter)
        {
            // Do stuff
        }
    }

可能性2:

    public void xxx<T>(T parameter) where T : IList
    {
        foreach (var listObject in parameter)
        {
            // Do stuff
        }
    }

可能性3:

    public void xxx<T>(T parameter)
    {
        IList list = parameter as IList;
        if (list != null)
        {
            foreach (var listObject in list)
            {
                // Do stuff
            }
        }
        else
        {
            // ...
        }
    }

可能性4:

    public void xxx(IList parameter)
    {
        foreach (var listObject in list)
        {
            // Do stuff
        }
    }

可能性5:

    public void xxx(object parameter)
    {
        IList list = parameter as IList;
        if (list != null)
        {
            foreach (var listObject in list)
            {
                // Do stuff
            }
        }
        else
        {
            // ...
        }
    }

另一个大问题:你为什么使用IList?如果你只需要枚举,使用IE的IEnumerable和IEnumerable,它将允许你使用更多类型并具有更大的灵活性。

答案 1 :(得分:3)

我会这样做:

public T myMethod<T>(T parameter) where T : IEnumerable

那么你不需要演员或转换任何东西,你可以直接做foreach:)

答案 2 :(得分:2)

我认为这段代码将确保您的参数始终为

public T myMethod<T>(T parameter) where T:IList
{
    // bla
}

答案 3 :(得分:2)

我会选择

public IEnumerable<T> MyMethod<T>(IEnumerable<T> parameter)
{
   ....
}

如果您愿意,可以IList<T>

你可以使用你的参数知道它是一个IEnumerable。这是最简单的方式,它与框架的工作方式相匹配。

答案 4 :(得分:1)

(parameter as IList)

怎么样?

我假设您不希望在所有情况下仅将参数限制为IList