繁体   English   中英

错误 System.MissingMethodException:没有为“System.Linq.Expressions.Expression”类型定义无参数构造函数

[英]Error System.MissingMethodException: No parameterless constructor defined for type of 'System.Linq.Expressions.Expression`1

我想为我的 web 服务创建动态表达式,以允许客户端应用程序传递动态查询以根据需要过滤数据。 为此,我正在尝试序列化/反序列化 C# / .NET 中的表达式 客户端应用程序可以传递到我的 web 服务中。 不幸的是,当我尝试反序列化表达式时出现以下错误。

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]

我要反序列化的类包含无参数构造函数,并使用适当的[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()
    {
    }
}

我创建了一个简单的表达式来返回 class 的单个实例。

Expression<Func<ModuleEntityAdmins, ModuleEntityAdmin>> expr1 = m => m.Modules.Find(q => q.Id == 1);

我使用以下 function 序列化表达式

public string SerializeObject(object objtoserialize)
{
    return JsonConvert.SerializeObject(objtoserialize);
}

在这一点上一切都很好。

然后我 go 使用以下 function 反序列化字符串。

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;
}

正是在尝试反序列化我得到错误的表达式时。

我已经正确地修饰了所涉及的类,并且它们都有无参数的构造函数,所以无法理解为什么我会收到错误。

有任何想法吗?

存在简单的实验室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>();           

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM