我有一个用于表示身份的类,其中包含一个字符串值。我还有另一个用于表示事件的类,其中包括一个身份对象和一个字符串名称。
我可以将对象从对象序列化为JSON字符串,但是当我将上述JSON转换为对象时,在MyIdentity构造函数中,字符串identityValue被传递为"00000000-0000-0000-0000-000000000000"。
我还尝试为MyIdentity提供两个构造函数,一个用于字符串,一个用于Guid,但结果相同。这背后的想法是将数据存储为字符串,但记住如果需要,我们可以将其强制转换为Guid(因为身份将由字符串或Guid形成)。
如@hvd所指出的那样,似乎只有get属性才有值,如果我也添加了set属性,那么它就可以工作了(因此我认为构造函数字符串值实际上并没有被使用)。我不想在标识上放置一个setter是因为编程设计的原因,它是一个标识,一旦创建就不应该被更改。
我可以使用公共get和受保护的set属性,我尝试了关键字
我可以将对象从对象序列化为JSON字符串,但是当我将上述JSON转换为对象时,在MyIdentity构造函数中,字符串identityValue被传递为"00000000-0000-0000-0000-000000000000"。
我还尝试为MyIdentity提供两个构造函数,一个用于字符串,一个用于Guid,但结果相同。这背后的想法是将数据存储为字符串,但记住如果需要,我们可以将其强制转换为Guid(因为身份将由字符串或Guid形成)。
public class MyEntityId : MyIdentity
{
public MyEntityId(Guid identityValue)
: base(identityValue)
{
}
}
public abstract class MyIdentity
{
protected readonly bool convertableAsGuid;
protected readonly string value;
public string Value { get { return this.value; } }
public MyIdentity(string identityValue)
{
this.value = identityValue;
Guid guid;
if(Guid.TryParse(identityValue, out guid)==false)
this.convertableAsGuid = false;
}
public MyIdentity(Guid identityValue)
{
this.value = identityValue.ToString();
this.convertableAsGuid = true;
}
}
static void Main(string[] args)
{
var evnt = new MyEvent(new MyEntityId(Guid.NewGuid()), "Jon Doe");
var eventHeaders = new Dictionary<string, object>
{
{"EventClrTypeName", evnt.GetType().AssemblyQualifiedName}
};
var serializerSettings = new JsonSerializerSettings { TypeNameHandling = TypeNameHandling.None };
var metadata = Encoding.UTF8.GetBytes(JsonConvert.SerializeObject(eventHeaders, serializerSettings));
var data = Encoding.UTF8.GetBytes(JsonConvert.SerializeObject(evnt, serializerSettings));
string dataAsString = Encoding.UTF8.GetString(data);
var eventClrTypeName = JObject.Parse(Encoding.UTF8.GetString(metadata)).Property("EventClrTypeName").Value;
var obj = JsonConvert.DeserializeObject(dataAsString, Type.GetType((string)eventClrTypeName));
// stepping through the above, a zero initialised GUID string is passed in to MyIdentity constructor
}
如@hvd所指出的那样,似乎只有get属性才有值,如果我也添加了set属性,那么它就可以工作了(因此我认为构造函数字符串值实际上并没有被使用)。我不想在标识上放置一个setter是因为编程设计的原因,它是一个标识,一旦创建就不应该被更改。
我可以使用公共get和受保护的set属性,我尝试了关键字
[JsonProperty]
,它可以工作......但是我不想用这些属性装饰我的领域对象 - 还有其他方法吗?
Value
属性没有setter,无法映射到构造函数参数,但这并不能真正帮助你解决它。 - user743382