我有一个接受T
的泛型方法,并返回IEnumerable。根据某些条件,我必须传入不同的课程。然后我迭代结果。
public IEnumerable<T> DoWorkGetResult<T>(string param)
yield return (T)typeof(T).GetMethod("CreateRow").Invoke(null, new object[] { someOtherParam });
//etc...
object resultRows;
if (param == "some condition")
resultRows = _data.DoWorkGetResult<TClass1>(param);
else
resultRows = _data.DoWorkGetResult<TClass2>(param);
foreach (var dataRow in resultRows) //error, object hasno public def for GetEnumerator
{
}
问题是:我不知道如何初始化返回值。我使用object
,这很好。但是我该如何循环呢?
答案 0 :(得分:2)
object resultRows
更改为IEnumerable<T> resultRows
,并且foreach应该编译。
答案 1 :(得分:0)
返回类型可以是任何泛型集合,主要是接口IEnumerable
,IList
等。不需要IEnumerable<T>
只是一个简单的IEnumerable
或IList
另一方面,当方法返回结果时,您将知道您正在处理什么类并进行转换。
在这种情况下我使用IList
为您提供更多功能。
var typeClass = typeof(T); // Or maybe Type.GetType("myNamespace.myClass")
var listInstance = (System.Collections.IList)typeof(List<>)
.MakeGenericType(typeClass)
.GetConstructor(Type.EmptyTypes)
.Invoke(null);
// Add Some instance from T
var objectInstance = Activator.CreateInstance(typeClass); // Create a Instance
listInstance.Add(objectInstance);
只是另一个想法。玩得开心:))