web-dev-qa-db-ja.com

型引数を使用法から推測することはできません。型引数を明示的に指定してみてください

誰かが私のために何かを明確にしてください。 ASP.NET MVC 2アプリには、次のメソッドを含むBaseViewModelクラスがあります。

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

各子ビューモデルはこのメソッドをオーバーライドし、いくつかのロジックに基づいてビューにレンダリングされるHTML属性の適切なセットを提供できるという考え方です。

<%: Html.TextBoxFor(model => model.MyProperty, Model.GetHtmlAttributes
                                                 (model => model.MyProperty)) %>

ただし、上記の行のように使用すると、ビューにアクセスしたときにコンパイルエラーが発生します。

メソッド '...BaseViewModel.GetHtmlAttributes<TModel,TProperty> Expression<System.Func<TModel,TProperty>)'の型引数は、使用法から推測できません。型引数を明示的に指定してみてください。

私は次のことをしなければなりません:

<%: Html.TextBoxFor(model => model.MyProperty, Model.GetHtmlAttributes
                             <ChildModel, string>(model => model.MyProperty)) %>

型を推測しようとする方法について明確なものを探していますが、HtmlHelper/TextBoxFor拡張メソッドで問題なく推測できますか?

これは、ビューのHtmlHelperがページ上部のViewUserControlで指定されているのと同じタイプに自動的に対応するのに対して、私のコードはBaseViewModel?モデル/プロパティタイプを推測できるような方法でこれを記述することは可能ですか?

34
Veli Gebrev

あなたの例では、コンパイラはどの型が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>();
   }
}

しかし、あなたは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" } };
    }
}
14
svick

この質問にはすでに受け入れられた答えがありますが、.NET初心者の私にとっては、間違っていたことに対する簡単な解決策があり、共有したいと思いました。

私はこれをやっていた:

@Html.HiddenFor(Model.Foo.Bar.ID)

私のために働いたのはこれに変わっていました:

@Html.HiddenFor(m => m.Foo.Bar.ID)

(「m」はモデルオブジェクトを表す任意の文字列です)

17
inanutshellus

私はこれと同じ問題を抱えていました、私の解決策:
web.configファイル内:

<compilation debug="true>
に変更する必要がありました
<compilation debug="true" targetFramework="4.0">

14
Jim

このエラーはcacheの問題とも関連しています。

私は同じ問題を抱えていましたが、cleaningbuildingの解決策をもう一度解決しました。

4
Zanon

C#コンパイラにはラムダのみがあります

arg => arg.MyProperty

arg(TModel)の推論型の場合、arg.MyProperty(TProperty)の型。それは不可能だ。

3
Ziav

それが役立つ場合は、nullを汎用TValueのパラメーターに渡すときにこの問題に遭遇しました。これを回避するには、null値をキャストする必要があります。

(string)null

(int)null

等.

0
DevDave