我有一个对象,我想在创建它之后才能读取它...即因为构造函数中的属性必须在GetHashCode中使用,因此一旦创建就无法更改。
我这是许多只读的课程之一:
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
解决这种情况的最佳方法是什么?
我是否应该调用可以更新属性的接口?
先前的接口是否会破坏封装或允许对我的对象进行更改?
我该怎么做呢?
答案 0 :(得分:26)
您可以删除new
类型约束,然后使用Activator.CreateInstance
。
而不是这个
T someResult = new T(tempresult);
写下这个:
T someResult = (T)Activator.CreateInstance(
typeof(T)
, new object[] { tempresult }
);
由于经历了反射,这可能会稍慢一些,并且编译器的静态检查将不会执行。但是,考虑到您的情况,看起来这些都不会产生重大问题。
答案 1 :(得分: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
中的{p> Func<object, T>
可以替换为tempResult
实际上的任何类型。