Я хотел бы создать динамический анонимный тип и вернуть это. Так скажем, у вас есть User
объект вроде этого:
public class User
{
public string Id { get; set; }
public string FirstName { get; set; }
public string LastName { get; set; }
}
Вы хотите передать обратно экземпляр этого типа в качестве ответа JSON, так что вы будете иметь некоторый код, как это:
Get["/user/{userid}"] = parameters =>
{
var user = UserService.GetById(Db, (string)parameters.userid);
if (user == null) return HttpStatusCode.UnprocessableEntity;
return Response.AsJson(user);
};
Но вы не хотите возвращать экземпляр User
, вместо этого вы хотите вернуть отдельный экземпляр типа dynamic
, который будет реализовывать только свойство, если значение свойства не равно null
для данного экземпляра.
Так что я хотел бы предложить код что-то вроде этого:
Get["/user/{userid}"] = parameters =>
{
var user = UserService.GetById(Db, (string)parameters.userid);
if (user == null) return HttpStatusCode.UnprocessableEntity;
dynamic userDTO = new ExpandoObject();
userDTO.Id = user.Id;
if (!string.IsNullOrEmpty(user.FirstName)) userDTO.FirstName = user.FirstName;
if (!string.IsNullOrEmpty(user.LastName)) userDTO.Lastname = user.LastName;
return Response.AsJson((ExpandoObject)userDTO);
};
Примечание 1 Вам не нужно проверить на Id
, так что подразумевается успешное возвращение экземпляра User
из базы данных ,
Примечание 2 Вы должны использовать dynamic
типа, так что вы можете включить специальные свойства. Проблема в том, что методы расширения не могут принимать динамические типы. Чтобы этого избежать, вам нужно объявить его как ExpandoObject
, но использовать его как динамический. Этот трюк несет накладные расходы на обработку, но он позволяет вам придать динамику ExpandoObject
при передаче его в метод расширения AsJson()
.