C# - 传递匿名函数作为参数(C# - Passing an anonymous function

2019-10-16 19:02发布

我使用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
                 }

它仍然提出为什么一个方法是有效的,但不是其他的问题。

Answer 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。



Answer 2:

当我转换方法为代表的编译器不抱怨:

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


文章来源: C# - Passing an anonymous function as a parameter