如何从方法返回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
提前感谢
实际上您返回的是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#中的泛型。
更多信息:泛型