2012-01-09 5 views
0

からオブジェクトへの参照を取得し、私は拡張子ジェネリックメソッド私が表現からTModelのオブジェクトへの参照を取得する必要がありC#の表現

public static void AddError<TModel>(
    this ModelStateDictionary modelState, 
    Expression<Func<TModel, object>> expression, 
    string resourceKey, 
    string defaultValue) 
{ 
    // How can I get a reference to TModel object from expression here? 
} 

を持っています。 次のコードで呼ばれるこの方法:

ModelState.AddError<AccountLogOnModel>(
    x => x.Login, "resourceKey", "defaultValue") 
+3

を表現におけるそのようなオブジェクトはありません - 'X'はパラメータであり、式の中で、型のオブジェクトを渡すことになっています。 – millimoose

+0

返信ありがとうございます、Inerdial) –

+1

'AddModelError(key、errorMessage)'メソッドでオブジェクトまたは 'Login 'というテキストを本当に使いたいですか?ラムダ式からプロパティ名を取得するには、 'ExpressionHelper.GetExpressionText'(MVCに組み込まれています)を使用します。 – kamranicus

答えて

1

メソッドに渡さずにTModelオブジェクト自体に到達することはできません。あなたが渡している表現は、「TModelからこのプロパティを取る」ということだけです。これは実際に動作するTModelを提供していません。だから、私はこのような何かにコードをリファクタリングします:

public static void AddError<TModel>(
    this ModelStateDictionary modelState, 
    TModel item, 
    Expression<Func<TModel, object>> expression, 
    string resourceKey, 
    string defaultValue) 
{ 
    // TModel's instance is accessible through `item`. 
} 

次に、あなたの呼び出し元のコードは次のようなものになります。

ModelState.AddError<AccountLogOnModel>(
    currentAccountLogOnModel, x => x.Login, "resourceKey", "defaultValue") 
+0

返事ありがとう、私は別の方法も表示されません。私はすでに昨日私のコードでこれを行った^) –

0

私はあなたが本当にテキスト「ログイン」ModelStateDictionaryに新モデル誤差を追加するために使用したいと想像。

public static void AddError<TModel>(this ModelStateDictionary modelState, 
    Expression<Func<TModel, object>> expression, string resourceKey, string defaultValue) 
{ 
    var propName = ExpressionHelper.GetExpressionText(expression); 

    modelState.AddModelError(propName, GetResource("resourceKey") ?? defaultValue); 
} 

は、リソースが見つからない場合は、それは単に説明のためだ nullを返すいくつかのリソースファクトリ/メソッドを持っていると仮定します。

+0

返信ありがとう私は、リソースキーやデフォルト値などのエラーデータをmodelStateオブジェクトとTModelオブジェクトに保存する必要があります。式では、エラーデータに関連するプロパティを渡します。これは、TModelオブジェクトに保存する必要があります。 ) –

+1

これを行うには、実際のオブジェクトをパラメータとして渡す必要があります。ジェネリックはオブジェクト参照自体ではありません。 – kamranicus