C# - Передача анонимной функции в качестве параметра
Я использую FluentData как форму для моей базы данных и пытаюсь создать общий метод запроса:
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 ответа
Компилятор не жалуется, когда я преобразовываю метод в делегат:
public static Func<dynamic, MyDbObject> TableToMyDbObject =
(row) => new MyDbObject
{
Id = row.Id
}
Проблема именно в том, что ошибка говорит...
Анонимная функция или группа методов не могут использоваться в качестве составляющего значения динамически связанной операции.
Это просто означает, что вы не можете использовать анонимную функцию, потому что одним из параметров является тип динамический, поэтому, чтобы исправить свой метод, вы можете просто привести параметр к 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 с использованием типа dynamic, поэтому динамически связанной операции нет.