2010-05-21 9 views
9

मैं एक विधि है कि संपर्क प्रत्येक प्रदायक, ग्राहक और निर्माता है (यह आसान समझा बनाने की कोशिश करने के लिए एक परिदृश्य है!)सी # पहुँच एक जेनेरिक ऑब्जेक्ट के गुणों को

मॉडल सभी द्वारा बनाई गई हैं की संख्या की गणना है एसक्यूएल कक्षाओं के लिए लिंक। प्रत्येक प्रदायक, ग्राहक और निर्माता, एक या अधिक संपर्क

public int CountContacts<TModel>(TModel entity) where TModel : class 
{ 
    return entity.Contacts.Count(); 
} 

पाठ्यक्रम does not काम के ऊपर हो सकता है क्योंकि 'इकाई' सामान्य है और does not पता है कि क्या यह संपत्ति 'संपर्क' है। क्या कोई इसे हासिल करने में मदद कर सकता है?

उत्तर

6

जेनेरिक में लागू कक्षाओं में एक इंटरफ़ेस संलग्न करना एक आसान तरीका होगा।

public int CountContacts<TModel>(TModel entity) where TModel : IContacts 


interface IContacts 
{ 
    IList<Contact> Contacts {get;} //list,Ilist,ienumerable 
} 
+0

+1 छोड़कर आपको सूची वापस नहीं लेनी चाहिए - अधिमानतः IList <> या शायद यहां तक ​​कि IENumerable <> – n8wrl

+0

अच्छा बिंदु। मैं तेजी से टाइप कर रहा था और इसे नहीं सोचा था। – kemiller2002

+0

इस समस्या में यह है कि LINQ से SQL कक्षाएं इस उद्देश्य के लिए EntitySets का उपयोग करती हैं, और एंटीटीसेट प्रकार के साथ संपर्क संपत्ति इंटरफ़ेस की प्रॉपर्टी को लागू नहीं करेगी, इसलिए उसे प्रत्येक वर्ग में इसे मैन्युअल रूप से कार्यान्वित करना होगा। – Venemo

3

एक तरह से एक अनुबंध लागू करने के लिए जहां आपूर्तिकर्ताओं, ग्राहकों और manufactors शामिल होना चाहिए एक Contacts संपत्ति इंटरफेस के साथ है।

interface IContactable 
{ 
    IEnumerable<Contact> Contacts {get;} 
} 


public int CountContacts<TModel>(TModel entity) where TModel : class, IContactable 
{ 
    return entity.Contacts.Count(); 
} 
0

एक और तरीका है बस गिनती के लिए एक इंटरफेस बनाने के लिए है: प्रत्येक इकाई एक अंतरफलक है कि Contacts प्रॉपर्टी वाला को लागू करें। आप इसे आईसीएन्टेबल कह सकते हैं।

MSDN

public interface ICountable<out T> 
{ 
    int Count{ get; } 
} 
public class MyCollection : ICountable<string>, ICountable<FileStream> 
{ 
    int ICountable<string>.Count 
    { 
     get { return 1; } 
    } 
    int ICountable<FileStream>.Count 
    { 
     get { return 2; } 
    } 
} 
1

सभी उत्तर से अब तक सही हैं, लेकिन यह भी कहना चाहिए कि कारण अपने कोड संकलन नहीं करता है TModel प्रकार आम में कुछ भी नहीं है क्योंकि। एक सामान्य बेस-क्लास या इंटरफेस निर्दिष्ट करके वे सभी आपके 'संपर्क' संपत्ति के साथ लागू होते हैं, आपका कोड काम करेगा।

0

समस्या के कई समाधान हैं।

  • समान सार कक्षा में प्रवेश करें या इकाइयों के साथ एक ही इंटरफेस को लागू करें। (दूसरों ने इसके साथ हर संभावित समाधान को समाप्त कर दिया।)
  • यदि आप .NET 4 का उपयोग कर रहे हैं, तो dynamic कीवर्ड सबसे सस्ता समाधान हो सकता है।

उदाहरण के लिए:

public int CountContacts(dynamic entity) 
{ 
    return entity.Contacts.Count(); 
} 

इसका मतलब है कि entity क्रम जब तक मूल्यांकन नहीं किया जाएगा, और यदि आप उस एक Contacts संपत्ति नहीं है एक वस्तु पर विधि कॉल के लिए हो, फेंक होगा आप एक अपवाद

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