为什么我不能通过Expression.New返回类型作为接口

时间:2016-05-10 03:40:20

标签: c# lambda

我正在尝试将Web API控制器放在单独的DLL中。我已经覆盖了默认控制器选择以从我的自定义DLL中选择一个类,但它抛出了一个异常,我的类确实实现了IHttpController,尽管它很清楚。

我的班级看起来像这样:

public class GetItemController : ApiController
{
    public GetItemController() { }

    public string Execute(string id)
    {
        return id;
    }
}

抛出异常的代码块如下所示:

public static Func<TBase> Create<TBase>(Type instanceType) where TBase : class
{
    NewExpression body = Expression.New(instanceType);
    return Expression.Lambda<Func<TBase>>(body, new ParameterExpression[0]).Compile();
}

它被称为:

Create<IHttpController>(typeof(GetItemController));

异常消息是:

'CustomDll.GetItemController' cannot be used for return type 'System.Web.Http.Controllers.IHttpController'

似乎它正在创建的表达式应该等同于以下函数:

public IHttpController temp() { return new GetItemController(); }

当我编写该方法时,不会抛出异常,所以我不确定我缺少什么。

1 个答案:

答案 0 :(得分:0)

原来,@ p.s.w.g指出我不小心引用了两个不同的DLL。一个来自nuGet的主项目,另一个来自GAC的另一个DLL。一切都被命名为相同,所以它不是立即显而易见的,但这就是问题所在。