2016-08-18 23 views
-1

多分誰かが解決策を知っています。私は表現を脱直列化できません。のC#JSONデシリアライズ式

クライアント側

var expresion= (Expression<Func<Company, bool>>)(model => model.Id ==id); 
var respond = new JObject(); 
respond .Add("Expression", JToken.FromObject(expresion)); 

サーバー側

JsonSerializer serializer = new JsonSerializer(); 
serializer.ConstructorHandling = ConstructorHandling.AllowNonPublicDefaultConstructor; 
T p = (T)serializer.Deserialize(new JTokenReader(jObject), typeof(T)); 

例外:私は思う

{"Unable to find a constructor to use for type System.Linq.Expressions.Expression`1[System.Func`2[HostStorageModels.Company,System.Boolean]]. A class should either have a default constructor, one constructor with arguments or a constructor marked with the JsonConstructor attribute. Path 'Expression.Type'."} 
+2

それは正しい、間違っているかを表示しますか? –

答えて

0

https://github.com/6bee/Remote.Linq

var query = (Expression<Func<Person, bool>>)(model => model.FirstName == "test2"); 
var remoteExpression = query.ToRemoteLinqExpression(); 

var request = new Request<Person> 
{ 
     Items = new List<Person>() 
     { 
      new Person() { FirstName = "test", Id = 1 }, 
      new Person() { FirstName = "test2", Id = 2 } 
     }, 
     Expression = remoteExpression 
}; 
var serializerSettings = new JsonSerializerSettings { TypeNameHandling = TypeNameHandling.Auto }; 
string jsonString = JsonConvert.SerializeObject(request, serializerSettings); 
var result = JsonConvert.DeserializeObject<Request<Person>>(jsonString, serializerSettings); 
var expresion = result.Expression.ToLinqExpression<Person, bool>(); 
var filtered = request.Items.Where(expresion.Compile()).ToList(); 
1

Expressionを構築するコンストラクタがないことを明示的に伝えています。 MSDNのドキュメントでExpression Constructor()にチェックを入れると、保護されていることがわかります。式を他のシリアライズ可能な形式で送信し、相手側で受け取ったときに再構築することもできます。

+0

多分誰かがそれを再構築する方法を知っていますか? –

関連する問題