将T转换为IList
本文关键字:IList 转换 | 更新日期: 2023-09-27 18:07:09
我有一个像下面这样的通用方法。我检查传入的参数是一个illist但是我怎么把参数转换成一个illist呢?
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
}
}
}
是的,Marnix的答案是正确的,你需要一个where,否则为什么你需要一个泛型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?如果你只需要枚举,使用IEnumerable和T的IEnumerable,它将允许你使用更多的类型和更大的灵活性。
我想这样做:
public T myMethod<T>(T parameter) where T : IEnumerable
那么你不需要强制转换或转换任何东西,你可以直接做你的foreach
:)
我认为这段代码将确保您的参数始终是
public T myMethod<T>(T parameter) where T:IList
{
// bla
}
我会选择
public IEnumerable<T> MyMethod<T>(IEnumerable<T> parameter)
{
....
}
或IList<T>
,如果你喜欢。
你可以使用你的参数,知道它是一个IEnumerable。这是最简单的方式,它符合框架的方式。
(parameter as IList)
呢?
我假设您不希望在所有情况下都将参数限制为IList
。