【问题标题】:Invoke generic method by type where type is interface按类型调用泛型方法,其中类型为接口
【发布时间】: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


【解决方案1】:

啊,我有 2 个接口 ICollectionEntity 每个都在解决方案内部的不同项目中,并且在我用于两个项目名称空间的 HomeController 中。谢谢你的建议。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-09-04
    • 1970-01-01
    • 1970-01-01
    • 2019-07-21
    • 1970-01-01
    相关资源
    最近更新 更多