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

时间:2012-06-05 15:01:18

标签: c# orm delegates fluentdata

我正在使用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<MyDbObject>(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
                 }

这仍然是一个问题,为什么一种方式是有效的而不是另一种方式。

2 个答案:

答案 0 :(得分:5)

问题正如错误所说......

  

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

它只是意味着您不能使用匿名函数,因为其中一个参数是Type dynamic,因此要修改您的方法,您只需将参数转换为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,因此没有动态绑定操作。

答案 1 :(得分:-3)

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

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