无法从用法推断出类型参数.尝试显式指定类型参数

Vel*_*rev 36 c# linq generics expression asp.net-mvc-2

有人可以请我澄清一些事情.在我的ASP.NET MVC 2应用程序中,我有一个BaseViewModel包含以下方法的类:

public virtual IDictionary<string, object> GetHtmlAttributes<TModel, TProperty>
                        (Expression<Func<TModel, TProperty>> propertyExpression)
{
    return new Dictionary<string, object>();
}
Run Code Online (Sandbox Code Playgroud)

我们的想法是每个子视图模型都可以覆盖此方法,并根据某些逻辑提供一组合适的html属性,以便在视图中呈现:

<%: Html.TextBoxFor(model => model.MyProperty, Model.GetHtmlAttributes
                                                 (model => model.MyProperty)) %>
Run Code Online (Sandbox Code Playgroud)

但是当在上面的行中使用时,当我点击视图时出现编译错误:

方法' ...BaseViewModel.GetHtmlAttributes<TModel,TProperty> Expression<System.Func<TModel,TProperty>)' 的类型参数不能从用法中推断出来.尝试显式指定类型参数.

我必须做以下事情:

<%: Html.TextBoxFor(model => model.MyProperty, Model.GetHtmlAttributes
                             <ChildModel, string>(model => model.MyProperty)) %>
Run Code Online (Sandbox Code Playgroud)

我只是在寻找一些关于它如何尝试推断类型的清晰度,在HtmlHelper/TextBoxFor扩展方法中这样做是没有问题的?

是因为HtmlHelper在视图中将自动ViewUserControl与页面顶部指定的类型相同,而我的代码可以用于继承的任何类型BaseViewModel?有可能以这样的方式编写它,它可以推断我的模型/属性类型?

ina*_*lus 17

我知道这个问题已经有了一个公认的答案,但对我来说,一个.NET初学者,有一个简单的解决方案,我做错了,我想我会分享.

我一直这样做:

@Html.HiddenFor(Model.Foo.Bar.ID)
Run Code Online (Sandbox Code Playgroud)

对我有用的是改变这个:

@Html.HiddenFor(m => m.Foo.Bar.ID)
Run Code Online (Sandbox Code Playgroud)

(其中"m"是表示模型对象的任意字符串)


svi*_*ick 14

在您的示例中,编译器无法知道应该TModel是什么类型.你可以做一些接近你可能尝试用扩展方法做的事情.

static class ModelExtensions
{
   public static IDictionary<string, object> GetHtmlAttributes<TModel, TProperty>
      (this TModel model, Expression<Func<TModel, TProperty>> propertyExpression)
   {
       return new Dictionary<string, object>();
   }
}
Run Code Online (Sandbox Code Playgroud)

virtual我认为你不可能有类似的东西.

编辑:

实际上,你可以virtual使用自引用泛型:

class ModelBase<TModel>
{
    public virtual IDictionary<string, object> GetHtmlAttributes<TProperty>
        (Expression<Func<TModel, TProperty>> propertyExpression)
    {
        return new Dictionary<string, object>();
    }
}

class FooModel : ModelBase<FooModel>
{
    public override IDictionary<string, object> GetHtmlAttributes<TProperty>
        (Expression<Func<FooModel, TProperty>> propertyExpression)
    {
        return new Dictionary<string, object> { { "foo", "bar" } };
    }
}
Run Code Online (Sandbox Code Playgroud)


小智 14

我有同样的问题,我的解决方案:
在web.config文件中:

<compilation debug="true>
必须改为
<compilation debug="true" targetFramework="4.0">