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

本文关键字:类型 IEnumerable 返回 方法 | 更新日期: 2023-09-27 18:00:06

因此,我试图实现的实质是将类型传递给方法,并从该方法返回该类型的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()
    {
    }
}

然而,这显然是返回了一个类型为dynamic的IEnumerable,我想知道是否有方法返回类型为Test 的IEnumerable

提前感谢

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

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

然而,在您的情况下,一个简单的通用方法可以满足您的要求:

var x = PassType<Test>();

这需要你的方法与此类似:

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

如果您在编译时不知道该类型,则可以使用MakeGenericMethod调用具有在运行时传递的类型参数的泛型方法:

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

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

我认为您应该了解C#中的泛型。

更多信息:泛型