2011-06-28 5 views
1

いくつかのコードを移行していて、きれいにフォーマットされたルックアップテーブルを持っていますが、後方互換性のために古風構造に変換する必要があります。オプションのアクションとして部分メソッドを提供するにはどうすればいいですか?

私はGetLookupTable()メソッドを持ち、SelectItemListのリストを取得しています。私のモデルやルックアップ呼び出しはすべてコード生成されていますが、返品SelectItemの一部を手作業で変更する必要があります。開発者は望むなら実装することができます。

訪問者は、部分的な方法として行われ、開発者は、彼らができる実装したいが、

以下のように、私はエラーを取得していた場合にエラー132が「メソッドからデリゲートを作成することはできませんInfoChoice.Web.Admin .ViewModels.Product.ProductCreditCardViewModel.LookupTableViewModel.CardTypeVisit(System.Web.Mvc.SelectListItem)」はここで実施宣言

ことなく部分的な方法であるカミソリ

を使用して呼び出し元のコードであるためここ

は、エラーが正しい選択項目リストデータを返しますストリップダウンモデル

// Generated model 
public partial class ProductCreditCardViewModel 
{ 
    [Required] 
    [DisplayName("Account - Card Type")] 
    [DefaultValue("")] 
    public string CardType { get; set; } 


    // *************************************************************************************************** 
    // Lookup Table calls for this model (Generated) 
    // *************************************************************************************************** 
    public partial class LookupTableViewModel : BaseLookupTableViewModel 
    { 
     partial void CardTypeVisit(SelectListItem item); 

     public SelectList CardType 
     { 
      get 
      { 
       return GetLookupItems("ProductCreditCardCardType", CardTypeVisit); 
      } 
     } 
    } 

} 

public partial class ProductCreditCardViewModel 
{ 
    // Custom Implementation Goes Here 
    public partial class LookupTableViewModel : BaseLookupTableViewModel 
    { 
     //partial void CardTypeVisit(SelectListItem item) 
     //{ 
     // item.Value = "|" + item.Value + "|"; 
     //} 
    } 
} 

ベースルックアップテーブルビューモデル

public class BaseLookupTableViewModel 
{ 
    public SelectList GetLookupItems(string lookupName) 
    { 
     return GetLookupItems(lookupName, "Name", "Text", null, null); 
    } 
    public SelectList GetLookupItems(string lookupName, Action<SelectListItem> itemVisitor) 
    { 
     return GetLookupItems(lookupName, "Name", "Text", null, itemVisitor); 
    } 
    public SelectList GetLookupItems(string lookupName, string dataValueField, string dataTextField, object selectedValue, Action<SelectListItem> itemVisitor) 
    { 
     // Go get some data from DataStore 
     var list = App.Data.Lookup.GetLookupList(lookupName); 

     // Convert to IEnumerable<SelectItemList> 
     var result = new SelectList(list, dataValueField, dataTextField, selectedValue); 

     // If developer would like to alter that list before it is returned, then developer should implement an item visitor 
     if (itemVisitor != null) 
     { 
      foreach (var item in result) 
      { 
       itemVisitor(item); 
      } 
     } 

     return result; 
    } 

    public void SampleVisitor(SelectListItem item) 
    { 
     item.Value = "Modified: " + item.Value; 
    } 
} 

答えて

1

です。部分的にはが存在しませんが実装されていない場合、そのような方法でデリゲートをバインドすることはできません。ここであなたの最善のオプションは、おそらくスイッチ(または同様のもの)に基づいて手動で呼び出すか、またはが実際に代理人を必要としている場合は、リフレクション(非公開バインディングフラグを指定することを忘れないでください)メソッドが存在する場合は、Delegate.CreateDelegateを使用してください。それとも怠惰なオプション:

private void OnCardTypeVisit(SelectListItem item) { CardTypeVisit(item); } 
partial void CardTypeVisit(SelectListItem item); 

OnCardTypeVisit代わりのCardTypeVisitにデリゲートをバインドします。委任の観点から

、これはまた、On*アプローチに非常に類似している間接デリゲート、それを変更することと同じくらい単純であり得る:

return GetLookupItems("ProductCreditCardCardType", x => CardTypeVisit(x)); 

は(しかし、それはむしろある場合デリゲート私は失敗が予想されます)

+0

これは私が探しているものと思われます:return GetLookupItems( "ProductCreditCardCardType"、x => CardTypeVisit(x)); –

+0

foreach(結果のvar item) { //この訪問者は次のことを行います:item.Value = "|" + item.Value + "|"; itemVisitor(item); LogUtil.Info(item.Value); } foreach(結果内のvarアイテム) { LogUtil.Info(item.Value); } このコードは結果を更新しません。すなわち、第1ループでは次の(| Visa |、| Mastercard |、| AMEX |)を取得しますが、2番目のループでは(Visa、Mastercard、AMEX)を取得します。私はアイテムが参照型であり、SelectItemListに対して更新すると思っていただろうが、それはコピーのようだ。 –

関連する問題