C# - 将匿名函数作为参数传递
C# - 将匿名函数作为参数传递
我正在使用FluentData作为我的数据库的ORM,并且我正在尝试创建一个通用的查询方法:\n
internal static T QueryObject(string sql, object[] param, Func mapper) { return MyDb.Sql(sql, param).QueryNoAutoMap (mapper).FirstOrDefault(); }
\n但是在我的类的函数中:\n
public class MyDbObject { public int Id { get; set; } } public static MyDbObject mapper(dynamic row) { return new MyDbObject { Id = row.Id }; } public static MyDbObject GetDbObjectFromTable(int id) { string sql = @"SELECT Id FROM MyTable WHERE Id=@Id"; dynamic param = new {Id = id}; return Query(sql, param, mapper); }
\n在`Query
无法将匿名函数或方法组用作动态绑定对象的组成值。
\n有人知道这意味着什么吗?\n编辑:\n当我将方法转换为委托时,编译器不会报错:\n
public static FuncTableToMyDbObject = (row) => new MyDbObject { Id = row.Id }
\n这仍然引发了一个问题,为什么一种方法是有效的,而另一种方法不是。
问题的原因是方法的调用方式不一致。在给定的示例中,将方法转换为委托时,编译器不会报错。代码创建了一个新的MyDbObject对象,并将其ID属性设置为行的ID值。但在问题中,代码创建了一个dynamic类型的对象,并给它一个ID属性,其值为行的ID值,然后将其作为参数传递给MyDbObject的构造函数。
为了解决这个问题,需要确保方法的调用方式与预期的一致。可以将方法转换为委托,并在调用时传递正确的参数。以下是解决方法的示例代码:
public static Func<dynamic, MyDbObject> TableToMyDbObject = (row) => new MyDbObject { Id = row.Id };
通过以上代码,我们可以看到,方法已经转换为了一个委托,并且在调用时传递了正确的参数。这样就可以正确地创建一个MyDbObject对象,并将其ID属性设置为行的ID值。