Я работаю над утилитой проецирования и у меня есть еще одно (еще?) Препятствие для устранения ...
Вот сценарий:
public class Person
{
public string FirstName { get; set; }
public string LastName { get; set; }
public int? AddressID { get; set; }
public Address Address { get; set; }
public string Otherproperty1 { get; set; }
public string Otherproperty2 { get; set; }
public string Otherproperty3 { get; set; }
public string Otherproperty4 { get; set; }
}
public class PersonSummary
{
public string FirstName { get; set; }
public string LastName { get; set; }
public int? AddressID { get; set; }
public AddressSummary Address { get; set; }
}
public class Address
{
public int AddressID { get; set; }
public string HouseNumber { get; set; }
public string StreetName { get; set; }
public string City { get; set; }
public string State { get; set; }
public int Zip { get; set; }
public string Otherproperty1 { get; set; }
public string Otherproperty2 { get; set; }
public string Otherproperty3 { get; set; }
public string Otherproperty4 { get; set; }
}
public class AddressSummary
{
public int AddressID { get; set; }
public string HouseNumber { get; set; }
public string StreetName { get; set; }
public string City { get; set; }
public string State { get; set; }
public int Zip { get; set; }
}
У меня успешно работает моя утилитачто-то вроде этого:
ProjectionUtility.Project<Person,PersonSummary>();
, которое будет возвращать это выражение. Лямбда:
p => new PersonSummary(){
FirstName = p.FirstName,
LastName = p.LastName,
AddressID = p.AddressID,
Address = p.AddressID.HasValue
? new AddressSummary(){ AddressID = p.Address.AddressID, HouseNumber = p.Address.HouseNumber, etc... }
: new AddressSummary(){}
}
Моя цель - установить Address = null, если AddressID.HasValue имеет значение false, например:
p => new PersonSummary(){
FirstName = p.FirstName,
LastName = p.LastName,
AddressID = p.AddressID,
Address = p.AddressID.HasValue
? new AddressSummary(){ AddressID = p.Address.AddressID, HouseNumber = p.Address.HouseNumber, etc... }
: null
}
Это легко сделать "вручную", однако, когда я пытаюсь программно создать эту лямбду с помощью выражений, я застрял ...
В настоящее время я использую то, что по существу ломаетсяк этому (я знаю, что синтаксис неправильный, но я сделал это таким образом, чтобы показать, что я делаю):
Expression.Condition(
p.AddressID.HasValue,
new AddressSummary(){},
new AddressSummary(){});
Если я попробую это:
Expression.Condition(
p.AddressID.HasValue,
new AddressSummary(){},
null);
Я не могу, потому что iftrue и iffalse должны быть одного типа (AddressSummary), поэтому я застрял в настоящий момент, создавая новый AddressSummary для аргумента iffalse.
Есть идеи?
Спасибо!