19

作成後にのみ読み取りたいオブジェクトがあります...つまり、コンストラクターのプロパティは 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

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

  • プロパティを更新するために呼び出すことができるインターフェイスが必要ですか?

  • 以前のインターフェイスはカプセル化を破ったり、オブジェクトに変更を加えたりできますか?

  • 他にどのようにアプローチすればよいですか?

4

2 に答える 2

32

new型制約を削除して、Activator.CreateInstance代わりに使用できます。

これの代わりに

T someResult = new T(tempresult);

これを書きます:

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

これは、リフレクションを通過するため、多少遅くなる可能性があり、コンパイラによる静的チェックは実行されません。ただし、シナリオを考えると、これらのいずれも重大な問題を引き起こすとは思われません。

于 2012-12-16T21:01:01.997 に答える
8

のコンストラクタにファクトリ デリゲートを渡すことができます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);
    }
}

objectinは、 の実際Func<object, T>のタイプに置き換えることができます。tempResult

于 2012-12-23T15:01:57.417 に答える