如何从方法返回类型X的IEnumerable

时间:2016-08-04 10:12:21

标签: c# linq oop types

所以我想要实现的目的主要是将一个类型传递给一个方法,并从该方法返回该类型的IEnumerable。

这是我迄今为止所管理的:

class Program
{
    static void Main(string[] args)
    {
        var x = PassType(typeof(Test));
    }

    public static IEnumerable<dynamic> PassType(Type destType)
    {
        var testInstance = new Test() { Name = "Greg", Age = 45, IsSomething = false };
        var destinationList = ((IEnumerable<object>)Activator.CreateInstance(typeof(List<>).MakeGenericType(new[] { destType }))).ToList();
        destinationList.Add(testInstance);
        return destinationList;
    }
}
public class Test
{
    public string Name { get; set; }
    public int Age { get; set; }
    public bool IsSomething { get; set; }

    public Test()
    {

    }
}

然而,这显然是返回一个IEnumerable类型的动态,我想知道是否有办法返回IEnumerable类型的测试

提前致谢

2 个答案:

答案 0 :(得分:2)

实际上你返回的 IEnumerable<TheType>,至少在运行时是这样。但是,您不能指望编译器推断您提供的运行时的类型参数。因此,编译器无法知道可枚举的类型,它只知道它是dynamic的东西。这就是为什么你不能在枚举中的实例上调用该类型的任何成员。

但是在你的情况下,一个简单的通用方法可以做你想要的:

var x = PassType<Test>();

您的方法需要与此类似:

IEnumerable<T> PassType<T>() { ...}

如果在编译时不知道该类型,可以使用MakeGenericMethod使用在运行时传递的type-argument来调用泛型方法:

var theMethod = typeof(Program).GetMethod("PassType").MakeGenericMethod(typeof(Test));
var x = theMethod.Invoke();

但是在编译期间,您仍然不了解类型,因此x的类型为object。由于IEnumerable<T>是自.NET 4.0以来的协变,如果所有类型都实现IEnumerable<object>,则可以将其转换为IEnumerable<MyBaseClass>MyBaseClass。但是你永远不会在编译时获得IEnumerable<MyType>并直接在实例上调用该类型的成员。

答案 1 :(得分:0)

我认为你应该看看C#中的泛型。

更多信息:Generics