2012-02-12 14 views
13

ऐसा प्रतीत नहीं होता है? तो सबसे अच्छा काम क्या है? विस्तार/गतिशील?कास्ट अज्ञात प्रकार इंटरफेस में?

public interface ICoOrd { 
    int x { get; set; } 
    int y { get; set; } 
}  

...

ICoOrd a = new {x = 44, y = 55}; 

रेफरी:

+0

मैं सिर्फ उत्सुक हूं: आप ऐसा करने की कोशिश कर रहे हैं जिसके लिए आपको ऐसा करने की आवश्यकता होगी? यदि आप इंटरफ़ेस को जानते हैं, तो आप स्पष्ट रूप से जानते हैं कि इंटरफ़ेस की कार्यक्षमता क्या है, ताकि आप उस कार्यक्षमता को प्रदान करने के लिए कक्षा को कार्यान्वित कर सकें, जिस स्थिति में आपको किसी अज्ञात प्रकार की आवश्यकता नहीं है, क्योंकि आप केवल अपनी कक्षा का उदाहरण बना सकते हैं। – xxbbcc

+0

क्यों आप चाहते हैं कि अज्ञात (आप इसके डिजाइन के बारे में "परवाह नहीं करते) इंटरफेस (जिसका मतलब है कि आप इसके डिजाइन के बारे में" देखभाल "करते हैं)? – gdoron

+2

@gdoron: एक इंटरफेस एक आसान काम है, और मुझे पता चला है कि एनन प्रकारों का अच्छा उपयोग (इस मामले में कोई LINQ) ने मेरे कोड को सरल बना दिया है * और * इरादे को स्पष्ट करने में मदद की है। वह प्रेरणा है। ज्यादातर मध्यवर्ती संरचनाओं के साथ करने के लिए। – sgtz

उत्तर

27

सर्वश्रेष्ठ "वर्कअराउंड" एक सामान्य, "नामित" प्रकार बनाने और उपयोग करने के लिए है जो इंटरफ़ेस लागू करता है।

लेकिन यदि आप जोर देते हैं कि एक अनाम प्रकार का उपयोग किया जाए, तो ImpromptuInterface जैसे गतिशील इंटरफ़ेस प्रॉक्सी फ्रेमवर्क का उपयोग करने पर विचार करें।

 var myInterface = new { x = 44, y = 55 }.ActLike<ICoOrd>(); 
+3

+1। आप क्ले (clay.codeplex.com) –

+0

पर भी देख सकते हैं ऐसा लगता है कि आप मास्टर जॉन स्कीट को हराते हैं ... – gdoron

+2

+1 यह अस्तित्व में नहीं था। Ty। – sgtz

7

इंटरफेस नहीं है, गुमनाम प्रकारों का कार्यान्वयन कभी नहीं। dynamic आपको इंटरफ़ेस पर या तो नहीं डालेगा, लेकिन आपको दो गुणों तक पहुंचने देगा। ध्यान दें कि अज्ञात प्रकार internal हैं, इसलिए यदि आप उन्हें dynamic का उपयोग करके असेंबली में उपयोग करना चाहते हैं, तो आपको InternalsVisibleTo का उपयोग करना होगा।

+1

+1: ty। मैंने InternalsVisibleTo (एमएस लिंक अब सवाल में) पर थोड़ा पढ़ा है। यह सहायक है। यह थोड़ा श्रम गहन दिखता है। क्या आपने फील्ड में उपयोग किए जाने वाले InternalsVisibleTo को देखा है? – sgtz

+2

@sgtz: श्रम गहन? यह एक ही विशेषता है। यदि आप दृढ़ता से टाइप की गई असेंबली का उपयोग कर रहे हैं, तो यह थोड़ा और अधिक काम करता है, लेकिन अन्यथा यह बहुत आसान है। मैं इसे यूनिट परीक्षणों के लिए बहुत उपयोग करता हूं। –

+6

@sgtz: InternalsVisibleTo आमतौर पर यूनिट परीक्षण के लिए उपयोग किया जाता है; कभी-कभी आप एक आंतरिक वर्ग के यूनिट परीक्षण करना चाहते हैं लेकिन परीक्षण असेंबली एक अलग असेंबली होना चाहते हैं। तो आप आंतरिक असेंबली तक परीक्षण असेंबली पहुंच देते हैं। उत्पादन कोड परिदृश्यों में इसका शायद ही कभी उपयोग किया जाता है। याद रखें, विधानसभाएं * संस्करण योग्य * हैं; यह असेंबली के पूरे * बिंदु * है। ज्यादातर परिस्थितियों में आप * दो विधानसभाओं के संस्करण * को स्वतंत्र रूप से बदलना नहीं चाहते हैं * जो एक दूसरे के आंतरिक * देखें। यदि आपके पास दो असेंबली हैं जिन्हें एक-दूसरे को आंतरिक रूप से देखने की आवश्यकता है, तो उन्हें एक में विलय करने पर विचार करें। –

1

मैं जानता हूँ कि यह एक पुराने सवाल और जवाब है, लेकिन मैं कुछ इकाई परीक्षण के लिए बिल्कुल वही बात पर काम करना चाहते इस पर इस पर ठोकर खाई। तब मैं हुआ कि मैं पहले से ही इस तरह Moq (facepalm) का उपयोग कर कर रहा हूँ।

मुझे ImpromptuInterface के लिए अन्य सुझाव पसंद है लेकिन मैं पहले से ही Moq का उपयोग कर रहा हूं और ऐसा लगता है कि यह एक बड़ा अनुसरण कर रहा है (यह राय है और तथ्य नहीं) अधिक स्थिर और लंबे समय तक समर्थित होगा।

इसलिए इस मामले के लिए हो

की तरह कुछ
public interface ICoOrd 
{ 
    int X { get; set; } 
    int Y { get; set; } 
} 

public class Sample 
{ 

    public void Test() 
    { 
     var aCord = new Mock<ICoOrd>(); 
     aCord.SetupGet(c => c.X).Returns(44); 
     aCord.SetupGet(c => c.Y).Returns(55); 

     var a = aCord.Object; 
    } 
} 

संपादित होगा: सिर्फ एक और तरीका कॉर्ड उपहास करने के लिए जोड़ने, शुरू कर दिया यह इस तरह से कर रही है और ऐसा लगता है थोड़ा बेहतर।

public void AnotherTest() 
{ 
    var aCord = Mock.Of<ICoOrd>(c => c.X == 44 && c.Y == 55); 
    //do stuff with aCord 
} 
संबंधित मुद्दे