错误 System.MissingMethodException:没有为 'System.Linq.Expressions.Expression`1 的类型定义无参数构造函数
Error System.MissingMethodException: No parameterless constructor defined for type of 'System.Linq.Expressions.Expression`1
我想为我的 Web 服务创建动态表达式,以允许客户端应用程序传递动态查询以根据需要过滤数据。为此,我试图在 C#/.NET 中序列化/反序列化 Expression。客户端应用程序可以传递到我的网络服务中。不幸的是,当我尝试反序列化表达式时出现以下错误。
System.MissingMethodException: No parameterless constructor defined for type of 'System.Linq.Expressions.Expression`1[[System.Func`2[[Common.Entities.ModuleEntityAdmins, Common, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null]
我正在反序列化的 classes 包含无参数构造函数,并装饰有适当的 [DataContract] 和 [DataMember]属性。
[DataContract]
public class ModuleEntityAdmins
{
[DataMember]
public List<ModuleEntityAdmin> Modules { get; set; }
/// <summary>
/// Default constructor
/// </summary>
public ModuleEntityAdmins()
{
this.Modules = new List<ModuleEntityAdmin>();
}
}
[DataContract]
public class ModuleEntityAdmin
{
[DataMember]
public int Id { get; set; }
[DataMember]
public bool Active { get; set; }
[DataMember]
public string Name { get; set; }
/// <summary>
/// Default constructor
/// </summary>
public ModuleEntityAdmin()
{
}
}
我创建了一个简单的 表达式 到 return class 的单个实例。
Expression<Func<ModuleEntityAdmins, ModuleEntityAdmin>> expr1 = m => m.Modules.Find(q => q.Id == 1);
我使用以下函数序列化 Expression。
public string SerializeObject(object objtoserialize)
{
return JsonConvert.SerializeObject(objtoserialize);
}
此时一切正常。
然后我使用以下函数反序列化字符串。
public T DeserializeObject<T>(string jsonObject)
{
T result = default(T);
if (!string.IsNullOrEmpty(jsonObject))
{
//errors on the line below!!
result = new JavaScriptSerializer().Deserialize<T>(jsonObject);
}
return result;
}
在尝试反序列化 Expression 时出现错误。
我已经正确装饰了所涉及的 classes,它们都有无参数构造函数,所以无法理解为什么我会收到错误。
有什么想法吗?
存在简单的图书馆Remote.Linq - https://github.com/6bee/Remote.Linq
您可以尝试示例代码:
Expression<Func<ModuleEntityAdmins, ModuleEntityAdmin>> expr1 = m => m.Modules.Find(q => q.Id == 1);
var remoteExpression = expr1.ToRemoteLinqExpression();
var s = SerializeObject(new RequestExp { Expression = expr1 });
RequestExp requestExp = DeserializeObject< RequestExp > (s);
Expression<Func<ModuleEntityAdmins, ModuleEntityAdmin>> expression = requestExp.Expression.ToLinqExpression<ModuleEntityAdmins, ModuleEntityAdmin>();
我想为我的 Web 服务创建动态表达式,以允许客户端应用程序传递动态查询以根据需要过滤数据。为此,我试图在 C#/.NET 中序列化/反序列化 Expression。客户端应用程序可以传递到我的网络服务中。不幸的是,当我尝试反序列化表达式时出现以下错误。
System.MissingMethodException: No parameterless constructor defined for type of 'System.Linq.Expressions.Expression`1[[System.Func`2[[Common.Entities.ModuleEntityAdmins, Common, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null]
我正在反序列化的 classes 包含无参数构造函数,并装饰有适当的 [DataContract] 和 [DataMember]属性。
[DataContract]
public class ModuleEntityAdmins
{
[DataMember]
public List<ModuleEntityAdmin> Modules { get; set; }
/// <summary>
/// Default constructor
/// </summary>
public ModuleEntityAdmins()
{
this.Modules = new List<ModuleEntityAdmin>();
}
}
[DataContract]
public class ModuleEntityAdmin
{
[DataMember]
public int Id { get; set; }
[DataMember]
public bool Active { get; set; }
[DataMember]
public string Name { get; set; }
/// <summary>
/// Default constructor
/// </summary>
public ModuleEntityAdmin()
{
}
}
我创建了一个简单的 表达式 到 return class 的单个实例。
Expression<Func<ModuleEntityAdmins, ModuleEntityAdmin>> expr1 = m => m.Modules.Find(q => q.Id == 1);
我使用以下函数序列化 Expression。
public string SerializeObject(object objtoserialize)
{
return JsonConvert.SerializeObject(objtoserialize);
}
此时一切正常。
然后我使用以下函数反序列化字符串。
public T DeserializeObject<T>(string jsonObject)
{
T result = default(T);
if (!string.IsNullOrEmpty(jsonObject))
{
//errors on the line below!!
result = new JavaScriptSerializer().Deserialize<T>(jsonObject);
}
return result;
}
在尝试反序列化 Expression 时出现错误。
我已经正确装饰了所涉及的 classes,它们都有无参数构造函数,所以无法理解为什么我会收到错误。
有什么想法吗?
存在简单的图书馆Remote.Linq - https://github.com/6bee/Remote.Linq
您可以尝试示例代码:
Expression<Func<ModuleEntityAdmins, ModuleEntityAdmin>> expr1 = m => m.Modules.Find(q => q.Id == 1);
var remoteExpression = expr1.ToRemoteLinqExpression();
var s = SerializeObject(new RequestExp { Expression = expr1 });
RequestExp requestExp = DeserializeObject< RequestExp > (s);
Expression<Func<ModuleEntityAdmins, ModuleEntityAdmin>> expression = requestExp.Expression.ToLinqExpression<ModuleEntityAdmins, ModuleEntityAdmin>();