Expression.Condition (nullableType.HasValue, new classInstance () {...}, null) это можно сделать другим способом? - PullRequest
1 голос
/ 27 октября 2010

Я работаю над утилитой проецирования и у меня есть еще одно (еще?) Препятствие для устранения ...

Вот сценарий:

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.

Есть идеи?

Спасибо!

1 Ответ

1 голос
/ 27 октября 2010

Вам нужно привести ноль к правильному типу. В этом случае:

Expression.Condition(
    p.AddressID.HasValue,
    new AddressSummary(){},
    (AddressSummary)null);

null может быть любого (ссылочного) типа, но по умолчанию он имеет тип System.Object. Если вы хотите, чтобы это был другой тип, вы должны сказать это.

...