2010-01-08 10 views
5

मैं निम्नलिखित वर्ग घोषणा की है:सी # पैरामीटर के रूप में इंटरफेस के साथ किसी ऑब्जेक्ट का समर्थन क्यों नहीं करता है?

public class EntityTag : BaseEntity, ITaggable 

मैं एक HTML सहायक विधि है:

public static string TagCloud(this HtmlHelper html, IQueryable<ITaggable> taggables, 
    int numberOfStyleVariations, string divId) 

यह मेरा ASP.NET MVC ascx है:

<%@ Control Language="C#" Inherits="System.Web.Mvc.ViewUserControl<IQueryable<EDN.MVC.Models.EntityTag>>" %> 
<%@Import Namespace="EDN.MVC.Helpers" %> 
<%= Html.TagCloud(Model, 6, "entity-tags") %> 

जब मैं में पारित एसीएक्स के लिए एक IQueryable संग्रह, मुझे यह त्रुटि मिलती है:

संकलन er त्रुटि संदेश: CS1928: 'System.Web.Mvc.HtmlHelper>' में 'टैगक्लाउड' और सर्वोत्तम एक्सटेंशन विधि अधिभार 'EDN.MVC.Helpers.EdnHelpers.TagCloud (System.Web.Mvc.HtmlHelper, - मूल्यों मैं गुजर रहा हूँ

public static string TagCloud(this HtmlHelper html, IQueryable<Object> taggables, int numberOfStyleVariations, string divId) 
    { 
     var tags = new List<ITaggable>(); 
     foreach (var obj in taggables) 
     { 
      tags.Add(obj as ITaggable); 
     } 
     return TagCloud(html, tags.AsQueryable(), numberOfStyleVariations, divId); 
    } 

मैं एक ही त्रुटि मिलती है: System.Linq.IQueryable, पूर्णांक, स्ट्रिंग) 'में कुछ ऐसी अमान्य तर्क

अगर मैं स्पष्ट रूप से इस के साथ वस्तु संग्रह बदलने की कोशिश है में कंपाइलर पसंद नहीं है।

क्या मेरी EntityTag क्लास स्वचालित रूप से IQueryable के रूप में समर्थित नहीं होनी चाहिए? मैं क्या खो रहा हूँ? यह कुछ स्पष्ट होना है। (मुझे आशा है।)

+0

आईटेक्टेबल IQueryable से प्राप्त करता है? –

+0

आप जिस मॉडल पैरामीटर को पार कर रहे हैं वह क्या है? मुझे लगता है कि कुछ कारणों से पैरामीटर को IQueryable में परिवर्तित नहीं किया जा सकता है। –

+0

टोनी: EntityTag बेसइन्टिटी से निकलता है और ITaggable –

उत्तर

5

मूलतः के लिए खोजें, आप एक विधि है कि जेनेरिक IQueryable<ITaggable> स्वीकार करता है, करने के लिए गैर सामान्य प्रकार IQueryable की एक वस्तु पारित करने के लिए कोशिश कर रहे हैं जो संकलक नहीं कर सकते हैं "मैच", जिसके परिणामस्वरूप सीएस 1 9 28 में (क्योंकि दो प्रकार वास्तव में अलग हैं)।

अपने अधिभार में स्वीकार करता है एक IQueryable<object> (जो पहले से ही एक सामान्य सूची के लिए आवश्यक रूपांतरण कर रही है), तो आप बस जैसे, बजाय गैर सामान्य से एक की AsQueryable का जेनेरिक वर्जन कॉल करने की आवश्यकता:

public static string TagCloud(this HtmlHelper html, IQueryable taggables, int numberOfStyleVariations, string divId) 
{ 
    var tags = new List<ITaggable>(); 
    foreach (var obj in taggables) 
    { 
     tags.Add(obj as ITaggable); 
    } 
    return TagCloud(html, tags.AsQueryable<ITaggable>(), numberOfStyleVariations, divId); 
} 

मुझे IQueryable से जोड़ने के लिए, साथ ही, कि IQueryable<T> निकला है, जिसका अर्थ है कि नहीं सभी IQueryable वस्तुओं IQueryable<T> हैं, इस प्रकार रूपांतरण आवश्यक बनाने की अनुमति दें। यदि स्थिति को उलट दिया गया था, यानी आपकी "असली" सहायक विधि को IQueryable ऑब्जेक्ट्स को संभालने के लिए परिभाषित किया गया था, तो आपको निश्चित रूप से IQueryable<T> को उस विधि से गुजरने में कोई समस्या नहीं होगी (क्योंकि IQueryable<T> ऑब्जेक्ट्स वास्तव में IQueryable) हैं।

प्रति क्रेग स्टंटज़, LINQ सुविधाओं का उपयोग करके एक और अधिक सुरुचिपूर्ण समाधान: <%= Html.TagCloud(Model.Select(t => (ITaggable)t), 6, "entity-tags") %>। यदि आप अपने पूछताछ प्रदाता इसे समर्थन देते हैं तो आप <%= Html.TagCloud(Model.Cast<ITaggable>(), 6, "entity-tags") %> का भी उपयोग कर सकते हैं।

+1

लागू करता है यह कारण (+1) के बारे में सही है, लेकिन मैं एक सरल समाधान का उपयोग करता हूं: '<% = Html.TagCloud (Model.Select (t => (ITaggable) t), 6, "इकाई-टैग")%> '। यदि आप अपने पूछताछ प्रदाता इसे समर्थन देते हैं तो आप 'IENumerable Cast()' का उपयोग भी कर सकते हैं। –

+0

उत्तर के लिए धन्यवाद। दुर्भाग्यवश, दूसरा संस्करण कभी संकलक द्वारा नहीं चुना जाता है जब इंटरफ़ेस-आधारित संस्करण भी घोषित किया जाता है, भले ही मैं एसीएक्स में डालूं। यह अभी भी मुझे असाधारण मानता है कि संकलक यह निर्धारित नहीं कर सकता कि EntityTag में ITaggable इंटरफ़ेस है, हालांकि। संक्षेप में, मैं अभी भी एक उचित समाधान की तलाश में हूं ... –

+0

धन्यवाद, क्रेग - यह उस तरह का सुरुचिपूर्ण कास्टिंग समाधान है जिसे मैं ढूंढ रहा था क्योंकि संकलक स्वचालित रूप से मेरे लिए नहीं डाला गया था। वह काम किया। यदि आप अपनी टिप्पणी को उत्तर में परिवर्तित करते हैं तो मैं इसे समाधान के रूप में स्वीकार करूंगा। –

1

आपका EntityTag वर्ग IQueryable है, लेकिन संकलक नहीं जानता है कि टैग की अपनी सूची वास्तव में EntityTag वस्तुओं की एक सूची है, यह केवल जानता है कि यह ITaggable को लागू वस्तुओं की एक सूची है, जो शायद isn टी IQueryable

2

सी # 4.0 इसका समर्थन करेगा। "सहप्रसरण और सी # 4 में contravariance"

संबंधित मुद्दे

 संबंधित मुद्दे