2011-06-28 39 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 + "|"; 
     //} 
    } 
} 

基地LookupTable中视图模型,将返回选择项目列表数据

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 in result) { //此访问者将执行以下操作:item.Value =“|” + item.Value +“|”; itemVisitor(item); LogUtil.Info(item.Value); } foreach(var item in result) { LogUtil.Info(item.Value); } 此代码不会更新结果。即在第一环路中,我获得以下(| Visa |,| Mastercard |,| AMEX |),但是在第二环路中(Visa,Mastercard,AMEX)。我会认为项目是一个引用类型,并会更新SelectItemList,但它似乎是一个副本。 –

相关问题