C # में पैरामीटर के रूप में बस एक प्रकार पास करना


130

Hypothetically यह करना मेरे लिए आसान होगा:

foo.GetColumnValues(dm.mainColumn, int)
foo.GetColumnValues(dm.mainColumn, string)

जहाँ GetColumns विधि पास किए गए प्रकार के आधार पर एक अलग विधि को कॉल करेगी।

हां, मैं इसे एक बूलीयन फ्लैग या ऐसे ही कर सकता था, मुझे आश्चर्य हुआ कि क्या ऐसा करने का कोई तरीका है जो शायद इसे पारित कर सकता है, और यह भी है:

टाइपोफ़ (arg [1]) या समान ...

मैं भी इस पद्धति को ओवरराइड कर सकता हूं, जेनरिक का उपयोग कर सकता हूं, आदि - मुझे पता है कि ऐसा करने के लिए अलग-अलग तरीके हैं, मैं बस उत्सुक था अगर यह संभव था।


मेरा विचार वास्तव में, क्या वास्तव में फू है पर निर्भर करता है। foo.GetColumnValues<int>(dm.mainColumn)जाने का रास्ता हो सकता है।
मेजर प्रोडक्शंस

1
जैसा कि मैंने कहा, मुझे एहसास है कि ऐसा करने के अन्य तरीके हैं (बूलियन ध्वज, जेनरिक, विधि को ओवरराइड करना) मुझे बस आश्चर्य हुआ कि क्या यह एक पैरामीटर के रूप में संभव था।
मार्क मेयो

@MarkMayo: यदि आप जानते हैं कि "आप विधि को ओवरराइड भी कर सकते हैं, जेनरिक आदि का उपयोग कर सकते हैं और आप जानते हैं कि ऐसा करने के अलग-अलग तरीके हैं, तो आप इस प्रश्न को समझ नहीं सकते हैं, यदि आप यह संभव था तो आप उत्सुक थे" । तो आप यह सब जानते हैं लेकिन अगर यह संभव है तो आप उत्सुक हैं ??
टिम शाल्टर

@TimSchmelter - जिस रूप में मैं वर्णन करता हूं। यानी इसे 2 के पैरामीटर के रूप में पास करना। जैसा कि यह पता चला है, रीड ने कहा था कि मैं क्या था - जहां आप उपयोग करते हैं (..., टाइप प्रकार)। यही मैं ढूंढ रहा था।
मार्क मेयो

1
अच्छा सवाल, अपवित्र, मैं एमएस को टाइप का उपयोग करते हुए VB.NET में निर्मित ऑपरेटरों के लिए एक पैरामीटर के रूप में उपयोग कर रहा हूँ।
चाल्की

जवाबों:


213

दो सामान्य दृष्टिकोण हैं। सबसे पहले, आप पास कर सकते हैंSystem.Type

object GetColumnValue(string columnName, Type type)
{
    // Here, you can check specific types, as needed:

    if (type == typeof(int)) { // ...

इसे इस तरह कहा जाएगा: int val = (int)GetColumnValue(columnName, typeof(int));

अन्य विकल्प जेनरिक का उपयोग करना होगा:

T GetColumnValue<T>(string columnName)
{
    // If you need the type, you can use typeof(T)...

यह बॉक्सिंग से बचने और कुछ प्रकार की सुरक्षा प्रदान करने का लाभ है, और इसे इस तरह कहा जाएगा: int val = GetColumnValue<int>(columnName);


1
आप एक एक्सटेंशन विधि, सार्वजनिक स्थैतिक T GetColumnValue <T> (यह स्ट्रिंग स्तंभ नाम) {...} भी कर सकते हैं, तब आप foo.GetColumnValues ​​<string> (dm.mainColumn
जोशुआ जी

लेकिन आप एक विधि को कैसे परिभाषित करते हैं जिसमें कई तर्क हैं और उनमें से एक सामान्य होना चाहिए? चूँकि जेनेरिक को विधि तर्क सूची से पहले परिभाषित किया गया है, आप कैसे जानते हैं कि कौन सा एक जेनेरिक होना चाहिए?
बैडमिंटनकैट

5
@ बैडमिंटनकैट T Foo<T,U>(string arg1, U arg2)या इसी तरह
रीड

पहले दृष्टिकोण का उपयोग करते समय, क्या कोई डिफ़ॉल्ट मान टाइप करने का तरीका है? (जैसे कुछ object GetColumnValue(string columnName, Type type = object)। यह मेरे लिए काम करने के लिए काफी नहीं लगता है, लेकिन यह जानना उपयोगी होगा।
डेव कोल

22

foo.GetColumnValues(dm.mainColumn, typeof(string))

वैकल्पिक रूप से, आप एक सामान्य विधि का उपयोग कर सकते हैं:

public void GetColumnValues<T>(object mainColumn)
{
    GetColumnValues(mainColumn, typeof(T));
}

और आप इसे तब उपयोग कर सकते हैं जैसे:

foo.GetColumnValues<string>(dm.mainColumn);

13

आप एक तर्क के रूप में एक प्रकार पास कर सकते हैं, लेकिन ऐसा करने के लिए आपको इसका उपयोग करना होगा typeof:

foo.GetColumnValues(dm.mainColumn, typeof(int))

विधि को पैरामीटर के प्रकार के साथ स्वीकार करना होगा Type


जहाँ GetColumns विधि पास किए गए प्रकार के आधार पर एक अलग विधि को कॉल करेगी।

यदि आप इस व्यवहार को चाहते हैं, तो आपको तर्क के रूप में टाइप पास नहीं करना चाहिए, बल्कि एक प्रकार के पैरामीटर का उपयोग करना चाहिए।

foo.GetColumnValues<int>(dm.mainColumn)

8
foo.GetColumnValues(dm.mainColumn, typeof(int));
foo.GetColumnValues(dm.mainColumn, typeof(string));

या जेनरिक का उपयोग करना:

foo.GetColumnValues<int>(dm.mainColumn);
foo.GetColumnValues<string>(dm.mainColumn);

3
मैंने आपको DV नहीं कहा, लेकिन यह शायद इसलिए था क्योंकि आप दिखा रहे हैं कि इसे कैसे कहा जाएगा और फ़ंक्शन की परिभाषा निर्दिष्ट नहीं की गई
JConstantine

3
मुझे इससे नफरत है जब लोगों को चम्मच खिलाने की जरूरत होती है। MSDN का वास्तव में संक्षिप्त उत्तर + पर्याप्त है। मुझे संदेह है कि डाउन-वोटर्स उत्तर देने वाले प्रतियोगी हैं - कितना क्षुद्र।
डैनी व्रॉड


0

आप टाइप प्रकार - iow, पास टाइपोफ़ (int) के तर्क का उपयोग कर सकते हैं। आप (शायद अधिक कुशल) दृष्टिकोण के लिए भी जेनरिक का उपयोग कर सकते हैं।


0

जेनेरिक प्रकारों का उपयोग करें!

  class DataExtraction<T>
{
    DateRangeReport dateRange;
    List<Predicate> predicates;
    List<string> cids;

    public DataExtraction( DateRangeReport dateRange,
                           List<Predicate> predicates,
                           List<string> cids)            

    {
        this.dateRange = dateRange;
        this.predicates = predicates;
        this.cids = cids;
    }
}

और इसे इस तरह से कॉल करें:

  DataExtraction<AdPerformanceRow> extractor = new DataExtraction<AdPerformanceRow>(dates, predicates , cids);
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.