【问题标题】:C# - Passing an anonymous function as a parameterC# - 将匿名函数作为参数传递
【发布时间】:2012-06-05 15:01:17
【问题描述】:

我正在使用 FluentData 作为我的数据库的 orm,并且我正在尝试创建一个通用查询方法:

internal static T QueryObject<T>(string sql, object[] param, Func<dynamic, T> mapper)
{
    return MyDb.Sql(sql, param).QueryNoAutoMap<T>(mapper).FirstOrDefault();
}

除了我班级的功能:

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<MyDbObject>(sql, param, mapper); 
}

Query&lt;MyDbObject&gt;(sql, param, mapper) 编译器说:

An anonymous function or method group connot be used as a constituent value of a dynamically bound object.

有人知道这意味着什么吗?

编辑:

当我将方法转换为委托时,编译器不会报错:

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

它仍然引出了一个问题,为什么一种方式有效,而另一种方式无效。

【问题讨论】:

  • @SatelliteSD 实际上我可能有一个解决方案。当我将静态方法转换为 lambda 表达式时,编译器不会报错。

标签: c# orm delegates fluentdata


【解决方案1】:

问题与错误所说的完全一样......

匿名函数或方法组不能用作组成部分 动态绑定操作的值。

这只是意味着您不能使用匿名函数,因为其中一个参数是动态类型,因此要修复您的方法,您只需将参数转换为 object

public static MyDbObject GetDbObjectFromTable(int id)
{
    string sql = @"SELECT Id FROM MyTable WHERE Id=@Id";

    dynamic param = new {Id = id}; // this Type dynamic is what causes the issue.

    // you could just fix with a cast to object
    return Query<MyDbObject>(sql, (object)param, mapper); 
}

或者大概是通过查看您的代码...只是。

    return Query<MyDbObject>(sql, id, mapper); 

使用 Func 委托时它不会报错的原因是因为您从不使用动态类型调用 DLR,因此没有动态绑定操作。

【讨论】:

    【解决方案2】:

    当我将方法转换为委托时,编译器不会报错:

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

    【讨论】:

    • 你在做两件完全不同的事情。在此示例中,您将创建一个新的 MyDboject 并将其 ID 属性设置为行 ID 值。在问题中,您正在创建一个 Type 动态对象,并为其提供具有行 ID 值的 ID 属性。然后您将其作为参数传递以构造 MyDboject...
    猜你喜欢
    • 1970-01-01
    • 2019-11-23
    • 2011-05-11
    • 2012-09-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多