基本上我想做很简单的事情。我想调用泛型方法,其中通用限制由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
时,它才起作用。
那么,你能说我为什么它适用于具体类而不是接口?
答案 0 :(得分:0)
啊,我在解决方案中的不同项目中有两个接口ICollectionEntity
,在我用于两个项目命名空间的HomeController中。谢谢你的建议。