我有一个类似下面的通用方法。我检查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
}
}
}
答案 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
。