पैरामीटर के साथ एक परिवर्तनीय प्रकार को चालू करने के लिए एक शानदार तरीका है?

यह कानूनी नहीं है:

public class MyBaseClass
{
  public MyBaseClass() {}
  public MyBaseClass(object arg) {}
}


public void ThisIsANoNo() where T : MyBaseClass
{
  T foo = new T("whoops!");
}

ऐसा करने के लिए, आपको टी के लिए ऑब्जेक्ट ऑब्जेक्ट पर कुछ प्रतिबिंब करना होगा या आपको एक्टिवेटर का उपयोग करना होगा। क्रिएट इंस्टेंस। दोनों बहुत बुरा हैं। क्या कोई बेहतर तरीका है?

0

4 उत्तर

where T : MyBaseClass, new()

केवल w/पैरामीटर रहित सार्वजनिक कन्स्ट्रक्टर काम करता है। उससे परे, सक्रिय करने के लिए वापस। क्रिएट इंस्टेंस (जो वास्तव में बुरा नहीं है)।

0
जोड़ा
एक सामान्य तरीके से नहीं।
जोड़ा लेखक Darren Kopp, स्रोत

मैं देख सकता हूं कि काम नहीं कर रहा है।

लेकिन यह करने से आपको क्या रोक रहा है?

public void ThisIsANoNo() where T : MyBaseClass
{
  MyBaseClass foo = new MyBaseClass("whoops!");
}

चूंकि सबकुछ MyBaseClass से प्राप्त करने जा रहा है, इसलिए वे MyBaseClass होंगे, है ना?

मैंने कोशिश की और यह काम करता है।

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            ThisIsANoNo();
            ThisIsANoNo();
        }

        public class MyBaseClass
        {
            public MyBaseClass() { }
            public MyBaseClass(object arg) { }
        }

        public class MyClass :MyBaseClass
        {
            public MyClass() { }
            public MyClass(object arg, Object arg2) { }
        }

        public static void ThisIsANoNo() where T : MyBaseClass
        {
            MyBaseClass foo = new MyBaseClass("whoops!");
        }
    }
}
0
जोड़ा
टी MyBaseClass का विस्तार है। आप MyBaseClass के एक उदाहरण को नया बना सकते हैं, लेकिन आप टी को "अप-कास्ट" नहीं कर सकते हैं, क्योंकि यह टी नहीं है। इसके अतिरिक्त, आपके इयानानो कार्यान्वयन, जबकि इसमें सामान्य हस्ताक्षर है, यह एक उदाहरण नहीं है प्रकार परिवर्तनीय।
जोड़ा लेखक Will, स्रोत
यह एक शून्य है कि यह कुछ भी वापस नहीं कर रहा है। और एक कास्ट इसे ठीक कर सकता है।
जोड़ा लेखक chrissie1, स्रोत
@ अब मैंने कोशिश की और यह काम करता है।
जोड़ा लेखक chrissie1, स्रोत
क्या होता है यदि आपके पास व्युत्पन्न कक्षा है जिसमें केवल एक कन्स्ट्रक्टर है जो 2 तर्क लेता है?
जोड़ा लेखक Abe Heidebrecht, स्रोत
यह विधि कभी भी प्रकार टी की वस्तुओं को वापस नहीं करेगी, केवल MyBaseClass के प्रकार की वस्तुएं।
जोड़ा लेखक Matt Howells, स्रोत

नहीं। यदि आप पैरामीटर में गुजर नहीं रहे थे, तो आप पैरामीटर रहित कन्स्ट्रक्टर की आवश्यकता के लिए अपने टाइप परम को बाधित कर सकते हैं। लेकिन, अगर आपको तर्क पारित करने की आवश्यकता है तो आप भाग्य से बाहर हैं।

0
जोड़ा

आप एक खाली कन्स्ट्रक्टर के अलावा एक विशेष कन्स्ट्रक्टर हस्ताक्षर रखने के लिए टी को बाधित नहीं कर सकते हैं, लेकिन आप वांछित हस्ताक्षर के साथ एक कारखाने विधि रखने के लिए टी को बाधित कर सकते हैं:

public abstract class MyBaseClass
{
    protected MyBaseClass() {}
    protected abstract MyBaseClass CreateFromObject(object arg);
}

public void ThisWorksButIsntGreat() where T : MyBaseClass, new()
{
    T foo = new T().CreateFromObject("whoopee!") as T;
}

हालांकि, मैं शायद इस परिदृश्य के लिए सार फैक्टरी जैसे एक अलग क्रिएशनल पैटर्न का उपयोग करने का सुझाव दूंगा।

0
जोड़ा