2012-12-16 31 views
17

Tôi có một đối tượng mà tôi muốn chỉ đọc sau khi được tạo ... cụ thể là vì các thuộc tính trong hàm tạo phải được sử dụng trong GetHashCode và do đó không thể thay đổi một khi đã được tạo.Không thể cung cấp đối số khi tạo một thể loại chung loại

tôi đây là một trong nhiều lớp học mà là readonly:

public class AccountLabel 
{ 
    private string result; 

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

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

Tôi có một lớp kết quả chung chung như

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 
    } 

vấn đề này của tôi là tôi muốn vượt qua một đối tượng vào constructor T nhưng không thể. Khi tôi nhập trình biên dịch này cho tôi biết Cannot provide arguments when creating an instance of variable type

Cách tốt nhất để giải quyết tình huống này là gì?

  • Tôi có nên có Giao diện mà tôi có thể gọi để cập nhật thuộc tính không?

  • Giao diện trước đó có bị đóng gói đóng gói hoặc cho phép thay đổi được thực hiện cho đối tượng của tôi không?

  • Tôi nên tiếp cận điều này bằng cách nào khác?

+2

bạn có thể tạo lớp Nhà máy biết cách tạo T (vì vậy JsonResult sẽ gọi MyFactory .tạo (tempresult) thay vì sử dụng mới –

+0

Tôi đã chỉnh sửa tiêu đề của bạn. Vui lòng xem, "[Câu hỏi nên bao gồm" thẻ "trong tiêu đề của họ?] (http://meta.stackexchange.com/questions/19190/) ", trong đó sự đồng thuận là" không, họ không nên ". –

Trả lời

23

Bạn có thể loại bỏ các loại hạn chế new, và sử dụng Activator.CreateInstance để thay thế.

Thay vì

T someResult = new T(tempresult); 

viết này này:

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

này có khả năng là hơi chậm vì phải trải qua phản chiếu, và kiểm tra tĩnh bởi trình biên dịch sẽ không được thực hiện. Tuy nhiên, xem xét kịch bản của bạn, nó không giống như một trong số này sẽ trình bày một vấn đề đáng kể trong kịch bản của bạn.

7

Bạn có thể vượt qua trong một đại biểu nhà máy để các nhà xây dựng của 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 trong có thể được thay thế bằng bất kỳ loại tempResult thực sự là.

Các vấn đề liên quan