2009-04-08 12 views
6

मैं एक सामान्य विधि में बाधा जोड़ने की कोशिश कर रहा हूं, इसलिए यह वैल्यू टाइप, स्ट्रिंग्स या न्यूबल योग्य मान प्रकारों की जांच करता है।वैल्यू टाइप, स्ट्रिंग्स और वैल्यू टाइप्स के नलबल के लिए जेनेरिक बाधा

समस्या यह है कि यह है:

  • मूल्य प्रकार struts
  • व्यर्थ कर रहे हैं
  • तार अपरिवर्तनीय संदर्भ प्रकार मूल्य प्रकार के होते हैं लेकिन एक "जहां एस: struct" में स्वीकार नहीं किया जाएगा प्रकार बाधा ।

तो क्या कोई जानता है कि कोई तरीका है कि मैं इन्हें स्वीकार कर सकता हूं और केवल इन प्रकारों को सामान्य बाधा में स्वीकार कर सकता हूं?

समस्या यह है कि मैं Expression<Func<T, S> पैरामीटर स्वीकार करने की कोशिश कर रहा हूं जो किसी दिए गए ऑब्जेक्ट के लिए इन प्रकार की संपत्ति का प्रतिनिधित्व करेगा।

कार्यक्षमता की तरह कुछ होगा निम्नलिखित (कोड ध्यान दें किसी भी मतलब नहीं है और बस कुछ मैं के लिए क्या देख रहा हूँ की एक विचार प्राप्त करने के लिए जल्दी है):

public class Person 
{ 
    public string Name {get; set;} 
    public DateTime? DOB {get; set;} 
    public int NumberOfChildren {get; set;} 
    public Car CurrentCar {get; set;} 
} 

--- 

internal void MyGenericMethod<T, S>(T myObject, Expression<Func<T, S> property){...} 

Person myPerson = new Person(); 
MyGenericMethod(myPerson, p => p.Name); //S would be a string 
MyGenericMethod(myPerson, p => p.DOB); //S would be a DateTime? 
MyGenericMethod(myPerson, p => p.NumberOfChildren); //S would be a struct 

तीन कॉल उपरोक्त सभी को स्वीकार कर लिया जाना चाहिए, लेकिन निम्नलिखित नहीं: धन्यवाद एंटोन और मार्क:

MyGenericMethod(myPerson, p => p.CurrentCar); //S would be a class and shouldn't compile 

अग्रिम

अद्यतन धन्यवाद। MyGenericMethod में अतिरिक्त पैरामीटर स्वीकार करने वाले 4 अलग-अलग हस्ताक्षर हैं, इसलिए मुझे मौजूदा 4 में से प्रत्येक के लिए 3 अलग-अलग (संरचना, शून्य, स्ट्रिंग) बनाने का विचार पसंद नहीं है ... यह बनाए रखने के लिए एक दुःस्वप्न होगा!

उत्तर

7

केवल एक चीज मैं के साथ आ सकते हैं तीन कार्य (बिना Expression<> सामान) का एक सेट है:

MyGenericFunction<T>(T t) 
    where T : struct 

MyGenericFunction<T>(T? t) 
    where T : struct 

MyGenericFunction(string s) 

अद्यतन को देखते हुए एक विधि के विभिन्न भार के देखते हैं कि, मेरा सुझाव कर सकते हैं:

class Holder 
{ 
    private object value; 

    public Holder(object value) 
    { 
     this.value = value; 
    } 

    public static implicit operator Holder(DateTime dt) 
    { 
     return new Holder(dt); 
    } 

    public static implicit operator Holder(string s) 
    { 
     return new Holder(s); 
    } 

    // Implicit conversion operators from primitive types 
} 

इस प्रकार अपने विधि

MyGenericMethod(Holder h); 
हो जाता है

अभी भी बहुत बोझिल है, लेकिन फिर भी यह काम कर सकता है।

+0

इसके बजाय 'संरचना धारक' को परिभाषित करने के लिए समझ में आ सकता है। फिर यह संकलन-समय "सिंटेक्टिक चीनी" बन जाता है, जिसका उद्देश्य यह निर्दिष्ट करना है कि क्या है और कानूनी नहीं है। लेकिन रनटाइम परिणाम कुशल होगा - कक्षा के लिए आवश्यक आवंटन/कचरा-संग्रह को समाप्त करता है। – ToolmakerSteve

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