2011-08-18 85 views
0

我有以下類別:隱式轉換類型問題

public class DictionaryBuilder<T> where T : IDictionary<string, object>, new() 
{ 
    private List<Tuple<string, object>> values_ = new List<Tuple<string, object>>(); 

    public DictionaryBuilder<T> WithValue(string key, object obj) 
    { 
     values_.Add(Tuple.Create(key, obj)); 
     return this; 
    } 
    public static implicit operator T(DictionaryBuilder<T> builder) 
    { 
     return builder.Build(); 
    } 
    public T Build() 
    { 
     var dict = new T(); 
     foreach (var value in values_) 
     { 
      dict.Add(value.Item1, value.Item2); 
     } 
     return dict; 
    } 
} 

public static class Admin 
{ 
    public static string IndexPath { get { return "Admin/Index"; } } 
    public static DictionaryBuilder<RouteValueDictionary> IndexRoute 
    { 
     get 
     { 
      return new DictionaryBuilder<RouteValueDictionary>() 
       .WithValue("controller", "Admin") 
       .WithValue("action", "Index"); 
     } 
    } 
} 

而且它使用的,如:

@Html.RouteLink("Admim", 
    Admin.IndexRoute 
     .WithValue("id",3), 
    new DictionaryBuilder<Dictionary<string,object>>() 
     .WithValue("class","AdminRouteLink") 

這是一個有點拗口,而泛型是阻礙意向一點。我想這樣做:

public class RouteValues : DictionaryBuilder<RouteValueDictionary> { } 
public class HtmlValues : DictionaryBuilder<Dictionary<string,object>> { } 

public static class Admin 
{ 
    public static string IndexPath { get { return "Admin/Index"; } } 
    public static RouteValues IndexRoute 
    { 
     get 
     { 
      return new RouteValues() 
       .WithValue("controller", "Admin") 
       .WithValue("action", "Index"); 
     } 
    } 
} 

@Html.RouteLink("Admim", 
    Admin.IndexRoute 
     .WithValue("id",3), 
    new HtmlValues() 
     .WithValue("class","AdminRouteLink") 

不幸的是,我得到一個轉換錯誤,我怕我不完全理解:

Cannot implicitly convert type 
'ControllerActionExporter 
    .DictionaryBuilder<System.Web.Routing.RouteValueDictionary>'  
to 
'ControllerActionExporter.RouteValues'. 
An explicit conversion exists (are you missing a cast?) 


     return new RouteValues() 
      .WithValue("controller", "Admin") 
      .WithValue("action", "Index"); //error occurs on this line 

我在做什麼錯誤,以及如何我是否糾正了這個問題?

回答

3

問題是WithValue返回DictionaryBuilder<T>,但IndexRoute屬性返回更具體的類型RouteValues。試着改變你的屬性返回DictionaryBuilder<T>

public static DictionaryBuilder<RouteValueDictionary> IndexRoute 
{ 
    get 
    { 
     return new RouteValues() 
      .WithValue("controller", "Admin") 
      .WithValue("action", "Index"); 
    } 
} 

對此的一個替代方案是創建一個通用的擴展方法的DictionaryBuilder<T>類返回相同類型中傳遞的一個:

public static T WithValue(this T builder, string key, object obj) 
{ 
     builder.WithValue(key, obj); 
     return builder; 
} 
+0

我寧願不必在我的所有視圖頁面上添加額外的使用條款,並使用類型系統,但是這樣比較好,完全沒有。謝謝。 – asawyer