【发布时间】:2015-02-04 13:38:43
【问题描述】:
基本上我想做非常简单的事情。我想调用泛型方法,其中泛型限制由接口 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', on 'System.Collections.Generic.IEnumerable`1[T] FetchT' 违反了类型 'T' 的约束。
但是当我将通用限制更改为Collection 时,它就可以工作了。
那么,你能告诉我为什么它适用于具体类而不适用于接口吗?
【问题讨论】:
-
你能用一个简短但完整的程序来演示这个问题吗?
-
我想弄清楚一些事情,给我几分钟...
-
我尝试制作这个小提琴,dotnetfiddle.net/nBMUBp,但它确实有效。您确定您的继承层次结构如您所展示的那样吗?你能用特定于
Language的代码替换通用代码并让它编译吗? -
首先,我建议您将 FirstOrDefault() 替换为 Single() (或 SingleOrDefault() 并检查是否为空)。那么,您能否发布一个实现 ICollectionsOrchestration 的具体类的示例?这可能是问题所在,但我们看不到该代码。
-
GetType(id)方法返回的类型是什么?你检查它是否是ICollectionEntity?
标签: c# asp.net .net asp.net-mvc generics