运行时类型的泛型方法<T>,并将结果存储在 IEnumerable <T>中



在将其标记为重复之前,请注意我已经阅读了所有这些问题,包括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>();
    }
}

最新更新