您可以使用自定義IContractResolver
以編程方式忽略對象的屬性。所以我認爲我會採取的方法是創建一個簡單的解析器,可以明確地忽略單個類型的單個屬性(顯然,如果需要,可以擴展此屬性),然後創建一個可以使用該解析器序列化的幫助器方法。使用ETag
屬性中的幫助器方法,您很好。
下面是解析器代碼:
class IgnorePropertyResolver : DefaultContractResolver
{
Type targetType;
string targetPropertyName;
public IgnorePropertyResolver(Type targetType, string propertyName)
{
this.targetType = targetType;
this.targetPropertyName = propertyName;
}
protected override IList<JsonProperty> CreateProperties(Type type, MemberSerialization memberSerialization)
{
IList<JsonProperty> props = base.CreateProperties(type, memberSerialization);
if (targetType == type)
{
props = props.Where(p => p.PropertyName != targetPropertyName).ToList();
}
return props;
}
}
這裏的輔助方法(我也是在那裏扔,因爲你沒有在你的問題中定義它哈希helper方法):
static class JsonHelper
{
public static string Serialize(object target, string propertyToIgnore)
{
JsonSerializerSettings settings = new JsonSerializerSettings();
settings.ContractResolver = new IgnorePropertyResolver(target.GetType(), propertyToIgnore);
return JsonConvert.SerializeObject(target, settings);
}
public static string Hash(string json)
{
using (var sha = new SHA1Managed())
{
return Convert.ToBase64String(sha.ComputeHash(Encoding.UTF8.GetBytes(json)));
}
}
}
最後,這裏的工作演示:
class Program
{
static void Main(string[] args)
{
Person p = new Person { Name = "Joe", Age = 26 };
Console.WriteLine("Etag = " + p.ETag);
Console.WriteLine();
Console.WriteLine(JsonConvert.SerializeObject(p, Formatting.Indented));
}
}
public class Person
{
public string Name { get; set; }
public int Age { get; set; }
public string ETag
{
get { return JsonHelper.Hash(JsonHelper.Serialize(this, "ETag")); }
}
}
輸出:
Etag = T99YVDlrbZ66YL2u5MYjyIyO4Qk=
{
"Name": "Joe",
"Age": 26,
"ETag": "T99YVDlrbZ66YL2u5MYjyIyO4Qk="
}
小提琴:https://dotnetfiddle.net/YgVJ4K
不是最漂亮的解決方案,但我剛剛創建了一個可以從省略領域的主要一個構造相似的對象,序列化,當我需要它。 – BradleyDotNET 2014-09-30 22:24:24
@BradleyDotNET是很多方式來做到這一點與automapper和東西,但它成爲一個麻煩,因爲我期望這個對象改變很多 – 2014-09-30 22:25:28