c# सामान्य प्रकार का एक उदाहरण बनाते समय तर्क प्रदान नहीं कर सकते




json generics (2)

आप 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);
    }
}

Func<object, T> में object Func<object, T> को किसी भी प्रकार के tempResult वास्तव में बदल दिया जा सकता है।

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

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

public class AccountLabel
{ 
    private string result;

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

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

मेरे पास इस तरह के सामान्य परिणाम वर्ग हैं I

  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

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

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

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

  • मुझे और यह कैसे जाना चाहिए?


आप new प्रकार की बाधा को निकाल सकते हैं, और इसके बजाय Activator.CreateInstance उपयोग कर सकते हैं।

इसके अलावा

T someResult = new T(tempresult);

इसे लिखें:

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

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





encapsulation