在泛型方法中,如何根据条件传入类并捕获返回值

时间:2015-07-17 19:34:13

标签: c# generics

我有一个接受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,这很好。但是我该如何循环呢?

2 个答案:

答案 0 :(得分:2)

正如Ron Beyer所提到的那样,如果resultRows只是一个对象,那么它就无法迭代。将其从object resultRows更改为IEnumerable<T> resultRows,并且foreach应该编译。

答案 1 :(得分:0)

返回类型可以是任何泛型集合,主要是接口IEnumerableIList等。不需要IEnumerable<T>只是一个简单的IEnumerableIList另一方面,当方法返回结果时,您将知道您正在处理什么类并进行转换。

在这种情况下我使用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);

只是另一个想法。玩得开心:))