2010-01-15 10 views
15

मैं एक आधार वर्ग का उपयोग करते हुए, एक विधि है, जहां मैं जेनरिक उपयोग करने के लिए मजबूर करने के लिए सांकेतिक शब्दों में बदलनेवाला वर्तमान वर्ग पर एक सामान्य अभिव्यक्ति का उपयोग करना चाहते हैं के साथ: अबवर्तमान वर्ग प्रकार संदर्भ के लिए कैसे जेनरिक

public class TestClass 
{ 
    public void DoStuffWithFuncRef<T>(Expression<Func<T, object>> expression) where T : TestClass 
     { 
      this.DoStuffWithFuncRef(Property<T>.NameFor(expression)); 
     } 
} 

, मैं टी को तत्काल कक्षा के प्रकार के रूप में मजबूर करना चाहता हूं, जो मुझे उम्मीद है कि सी # कंपाइलर सामान्य रूप से उपयोग करने के लिए सामान्य प्रकार को समझने का कारण होगा। जैसे मैं नीचे doStuff विधि है, जहां मैं सही प्रकार को निर्दिष्ट करने की कोडिंग से बचने के लिए चाहते हैं - बल्कि doStuffILikeButCannotGetToWork विधि का उपयोग करें:

public class SubTestClass : TestClass 
{ 
    public string AProperty { get; set; } 

    public void doStuff() 
    { 
     this.DoStuffWithFuncRef<SubTestClass>(e => e.AProperty); 
    } 

    public void doStuffILikeButCannotGetToWork() 
    { 
     this.DoStuffWithFuncRef(e => e.AProperty); 
    } 
} 

यह संभव है? क्या मुझे इसे अलग तरीके से करना चाहिए?

public class TestClass<T> where T : TestClass<T> 
{ 
    public void DoStuffWithFuncRef(Expression<Func<T, object>> expression) 
    { 
     this.DoStuffWithFuncRef(Property<T>.NameFor(expression)); 
    } 
} 

और यह से निकाले जाते हैं:

उत्तर

19

आधार वर्ग ही सामान्य बनाने

public class SubTestClass : TestClass<SubTestClass> { 
    // ... 
} 

आप एक ही जड़ के साथ एक वंशानुगत पदानुक्रम की आवश्यकता है, तो किसी अन्य से सामान्य आधार वर्ग के वारिस गैर-जेनेरिक संस्करण:

public class TestClass { ... } 
public class TestClass<T> : TestClass where T : TestClass<T> 

बेशक आपको मूल कक्षाएं बनाना चाहिए सार।

+0

धन्यवाद। मैंने जिस तरह से आप descibe में पूरी कक्षा जेनेरिक बनाने के बारे में नहीं सोचा था, लेकिन यह काम करता है और थोड़ा वाक्यविन्यास ओवरहेड का कारण बनता है। – Thies

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