2012-12-16 36 views
17

का उदाहरण बनाते समय तर्क प्रदान नहीं कर सकता है मेरे पास एक ऑब्जेक्ट है जिसे मैं इसे बनाने के बाद ही पढ़ना चाहता हूं ... अर्थात् क्योंकि कन्स्ट्रक्टर में गुणों को गेटहाशकोड में उपयोग किया जाना चाहिए, और इसलिए नहीं बदला जा सकता एक बार बनाया गया।जेनेरिक प्रकार

मैं इस कई वर्गों है कि केवल पढ़ने के लिए कर रहे हैं में से एक है:

public class AccountLabel 
{ 
    private string result; 

    public AccountLabel(string result) 
    { 
     // TODO: Complete member initialization 
     this.result = result; 
    } 

    public string JSONRPCData { get { return this.result; } } 
} 

मैं इस

public class JsonResult<T> where T : JObject, new() 
    { 
    private T bhash; 
    private string p; 
    private JsonErrorResponse error; 
    private int _id; 
    private Newtonsoft.Json.Linq.JObject ret; 

    public JsonResult(Newtonsoft.Json.Linq.JObject ret) 
    { 
     this.ret = ret; 

     var tempError = ret["error"]; 
     var tempid = ret["id"]; 
     JsonErrorResponse error = new JsonErrorResponse(tempError); 
     this.error = error; 
     this._id = 1; 


     var tempresult = ret["result"]; 
     T someResult = new T(tempresult); // <--- here is my problem 
    } 

मेरे समस्या की तरह एक सामान्य परिणाम वर्ग है कि मैं टी के निर्माता में एक वस्तु पारित करने के लिए करना चाहते हैं लेकिन नहीं कर सकता जब मैं इसे टाइप करता हूं तो संकलक मुझे Cannot provide arguments when creating an instance of variable type

इस स्थिति के आसपास काम करने का सबसे अच्छा तरीका क्या है?

  • क्या मेरे पास एक इंटरफ़ेस होना चाहिए जिसे मैं कॉल कर सकता हूं जो संपत्ति को अपडेट करेगा?

  • क्या पिछले इंटरफ़ेस ब्रेक encapsulation या मेरे ऑब्जेक्ट में परिवर्तन करने की अनुमति देगा?

  • मुझे इससे और कैसे संपर्क करना चाहिए?

+2

आप एक फैक्टरी वर्ग जानता है कि टी बनाने का तरीका बना सकते हैं (ताकि JsonResult MyFactory .create (tempresult कहेंगे) के बजाय नया –

+0

मैं अपने शीर्षक संपादित किया है का उपयोग करने का। कृपया देखें, "[चाहिए सवालों में शामिल हैं" टैग "में उनके खिताब?] (http://meta.stackexchange.com/questions/19190/) ", जहां आम सहमति है" नहीं, उन्हें नहीं करना चाहिए "। –

उत्तर

23

आप new प्रकार बाधा को दूर, और बदले Activator.CreateInstance उपयोग कर सकते हैं।

इस

T someResult = new T(tempresult); 

लिखने के बजाय इस

:

T someResult = (T)Activator.CreateInstance(
    typeof(T) 
, new object[] { tempresult } 
); 

इसका कारण यह है प्रतिबिंब के माध्यम से जाने के लिए कुछ हद तक धीमी होने की संभावना है, और संकलक द्वारा स्थिर जांचें निष्पादित नहीं किया जाएगा। हालांकि, आपके परिदृश्य पर विचार करते हुए, ऐसा लगता है कि इनमें से कोई भी आपके परिदृश्य में एक महत्वपूर्ण समस्या पेश नहीं करेगा।

7

आप JSonResult<T> के निर्माता के लिए एक कारखाना प्रतिनिधि पास कर सकता है:

public class JsonResult<T> where T : JObject 
{ 
    public JsonResult(Newtonsoft.Json.Linq.JObject ret, Func<object, T> factory) 
    { 
     var tempresult = ret["result"]; 
     T someResult = factory(tempresult); 
    } 
} 

object में साथ जो कुछ भी tempResult के प्रकार के वास्तव में है प्रतिस्थापित किया जा सकता।

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