按类型调用泛型方法,其中type是interface

时间:2015-02-04 13:38:43

标签: c# asp.net .net asp.net-mvc generics

基本上我想做很简单的事情。我想调用泛型方法,其中通用限制由interface-ICollectionEntity给出。 这是来自我的控制器的动作 - 它是用于开发目的的临时解决方案。

public class HomeController : BaseController
{
    protected ICollectionsOrchestration collections;
    public ActionResult Collection(string id)
    {
        var type = collections.GetType(id);

        using (var uow = UnitOfWorkFactory.Create())
        {
            try
            {
                MethodInfo method = collections.GetType().GetMethods().FirstOrDefault(f =>
                    f.Name.Equals("Fetch") && f.GetParameters().Count() == 0);
                MethodInfo generic = method.MakeGenericMethod(type);

                var data = (IEnumerable<ICollectionEntity>) generic.Invoke(collections, null);
                return View(data);
            }
            catch (Exception ex)
            {
                var msg = ex.Message;
            }
        }

        return View();
    }
}

这是ICollectionsOrchestration接口和ICollectionEntity的具体示例。

public interface ICollectionsOrchestration
{
    Type GetType(string type);
    IEnumerable<T> Fetch<T>() where T : ICollectionEntity;
}

public class Collection : ICollectionEntity { }
public partial class Language : Collection { }

但是在MethodInfo generic = method.MakeGenericMethod(type);行上我得到了例外:

  

GenericArguments [0],'Idea.Data.Collections.Language','System.Collections.Generic.IEnumerable`1 [T] FetchT'违反了'T'类型的约束。

但是当我将通用限制改为Collection时,它才起作用。 那么,你能说我为什么它适用于具体类而不是接口?

1 个答案:

答案 0 :(得分:0)

啊,我在解决方案中的不同项目中有两个接口ICollectionEntity,在我用于两个项目命名空间的HomeController中。谢谢你的建议。