C# - 将匿名函数作为参数传递

24 浏览
0 Comments

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(sql, param, mapper)`处,编译器报错:\n

无法将匿名函数或方法组用作动态绑定对象的组成值。

\n有人知道这意味着什么吗?\n编辑:\n当我将方法转换为委托时,编译器不会报错:\n

public static Func TableToMyDbObject =
    (row) => new MyDbObject
                 {
                     Id = row.Id
                 }

\n这仍然引发了一个问题,为什么一种方法是有效的,而另一种方法不是。

0
0 Comments

问题的原因是方法的调用方式不一致。在给定的示例中,将方法转换为委托时,编译器不会报错。代码创建了一个新的MyDbObject对象,并将其ID属性设置为行的ID值。但在问题中,代码创建了一个dynamic类型的对象,并给它一个ID属性,其值为行的ID值,然后将其作为参数传递给MyDbObject的构造函数。

为了解决这个问题,需要确保方法的调用方式与预期的一致。可以将方法转换为委托,并在调用时传递正确的参数。以下是解决方法的示例代码:

public static Func<dynamic, MyDbObject> TableToMyDbObject =
    (row) => new MyDbObject
                 {
                     Id = row.Id
                 };

通过以上代码,我们可以看到,方法已经转换为了一个委托,并且在调用时传递了正确的参数。这样就可以正确地创建一个MyDbObject对象,并将其ID属性设置为行的ID值。

0
0 Comments

问题的出现原因是因为在使用动态绑定操作时,不能使用匿名函数作为参数。解决方法是将参数转换为object类型或直接使用id作为参数。使用Func委托没有出错的原因是因为没有使用动态类型,所以没有动态绑定操作。

0