2012-12-16 10 views
17

オブジェクトを作成した後に読み込みたい、つまりコンストラクタのプロパティをGetHashCodeで使用する必要があるため変更できないためです一度作成されました。ジェネリック型のインスタンスを作成するときに引数を提供できません

私はこれは読み取り専用です、多くのクラスの1つです:

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 
    } 

私の問題は、私はTのコンストラクタにオブジェクトを渡したいということであるように、私は一般的な結果クラスを持っていますしかしできません。私がこれをタイプすると、コンパイラは教えてくれますCannot provide arguments when creating an instance of variable type

この状況を回避する最も良い方法は何ですか?

  • プロパティを更新する必要があるインターフェイスを用意してください。

  • 以前のインターフェイスでカプセル化が中断されたり、オブジェクトに変更が加えられることはありますか?

  • 他にどのようにこのアプローチをとるべきですか?

+2

Tを作成する方法を知っているFactoryクラスを作成することができます(つまり、JsonResultはMyFactoryをという名前で呼び出すことになります) –

+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); 
    } 
} 

objecttempResultの種類は、実際には何に置き換えることができます。

関連する問題