无法从TModel,TProperty的用法推断出方法的类型参数

时间:2014-08-18 20:01:19

标签: c# generics type-inference

public class Test { public int Id { get; set; } }
class Program
{
    static void Main(string[] args)
    {
        var model = new Test { Id = 222 };
        Helpers.TestMethod(m => model.Id); // doesn't work
        Helpers.TestMethod<Test, int>(m => model.Id); // works
        Console.ReadKey();
    }
}

public class Helpers
{
    public static string TestMethod<TModel, TProperty>(Expression<Func<TModel, TProperty>> expression)
    {
        // Do some work on expression
        return string.Empty;
    }
}

如果我使用@ Html.TextBoxFor扩展方法。我不必像这样指定类型:@ Html.TextBoxFor,这是为什么?为什么我必须明确指定类型?

1 个答案:

答案 0 :(得分:3)

  

如何推断Model的{​​{1}}?当我从未指定Html.TextBoxFor时。

如果您查看Html.TextBoxFor<Test, int>的实施方式,您会发现它是一种扩展方法:

TextBoxFor

public static MvcHtmlString TextBoxFor<TModel, TProperty>( this HtmlHelper<TModel> htmlHelper, Expression<Func<TModel, TProperty>> expression ) 用于推断htmlHelper,这正是您的方法所缺失的。

TModel

现在您可以在不指定泛型类型的情况下调用它:

public static string TestMethod<TModel, TProperty>(TModel model, Expression<Func<TModel, TProperty>> expression)

您还可以将其作为扩展方法,添加var model = new Test { Id = 222 }; TestMethod(model, m => m.Id); // works just fine 修饰符

this

允许你调用它

public static string TestMethod<TModel, TProperty>(this TModel model, Expression<Func<TModel, TProperty>> expression)