在将其标记为重复之前,请注意我已经阅读了所有这些问题,包括Jon Skeet的回答,但我仍然有一个问题。我已经浏览过的链接,还有一些我没有在这里列出:
用反射和动态参数count实例化对象
指示泛型返回动态类型的对象
是否有一种方法可以在实例化从泛型继承的类型时不使用动态?
我已经搜索了相同的问题,并意识到在运行时提供类型T是不可能的,因为泛型类型T必须在编译时已知。我明白这一点,但我有以下场景:
基本上我想这样做:
public IEnumerable<T> GetListing<T>(string entityName)
{
Entity entity = new Entity { Name = entityName, Action = "Select" };
ResponsePacket<T> entityViewModel = new ResponsePacket<T>();
entityViewModel.Records = myHttpClient.GetAllEntities<T>(entity, "10", "0").Content;
return entityViewModel.Records.AsEnumerable();
}
然后这样命名:
public IEnumerable<myType> CallListing(string entityName)
{
Type myType = {get type of entityName through some method eg User}
IEnumerable<myType> result = GetListing<myType>;
return result;
}
现在我已经读到这个不能被实现没有反射这意味着我必须创建一个GetListing<>
的实例,然后通过反射告诉它关于<T>
。
我的问题是,即使我使用反射来创建GetListing<myType>
的实例并通过反射在运行时调用它,我如何在IEnumerable<myType>
中获得GetListing<T>
的返回结果?反射也会在运行时提供IEnumerable<myType>
的结果吗?
据我所知,反射的返回结果是一个对象,我如何将其强制转换为IEnumerable<myType>
,我不能将其强制转换为如下的IList:
IList returnedresult = (IList)returnedResult
,因为我的网格/视图页面需要IEnumerable<myType>
即IEnumerable<User>
或IEnumerable<Roles>
的模型,我希望通过反射得到。我必须将模型传递给我的视图@model IEnumerable<GridModel>
,其中gridmodel将需要IEnumerable<myType>
。
我也读到动态是这里的方式,但我不知道如何。我将如何实现我正在寻找使用动态?我不知道。请告诉我是否有办法将反射方法的返回结果存储在IEnumerable<myType>
中。
如果这两个都不能实现,那么请告诉我如何以其他方式实现这一点。
在编译时我不知道实体的类型,否则会有很多代码复制&如果我有100个实体,我想调用GetListing(),我将不得不编写GetUserListing, GetRolesListing, Get…Listing(),然后我将不得不显式调用GetListing<User>
, GetListing<Roles>
从GetUserListing, GetRolesListing方法内部失败的目的。
我认为这就是你所关注的:
void Main()
{
Console.WriteLine(Get<int>("System.Int32").ToString());
Console.WriteLine(Get<string>("System.String").ToString());
Console.WriteLine(Get<double>().ToString());
Console.WriteLine(Get<long>().ToString());
}
public Type TypeResolver(string type)
{
return Type.GetType(type);
}
public IEnumerable<T> Get<T>(string typeName)
{
var type = TypeResolver(typeName);
var entityStore = new EntityStore();
return entityStore.GetType().GetMethod("GetAll").MakeGenericMethod(type).Invoke(entityStore, null) as IEnumerable<T>;
}
public IEnumerable<T> Get<T>()
{
var entityStore = new EntityStore();
return entityStore.GetType().GetMethod("GetAll").MakeGenericMethod(typeof(T)).Invoke(entityStore, null) as IEnumerable<T>;
}
public class EntityStore
{
public IEnumerable<T> GetAll<T>()
{
return new List<T>();
}
}