4 Stimmen

Bitte helfen Sie mir zu verstehen NewExpression.Members

Informiert NewExpression.Members das LINQ-Runtime, wie die Konstruktorparameter eines Typs mit seinen Eigenschaften verknüpft werden sollen? Und wenn ja, gibt es ein Attribut, um die Zuordnung festzulegen? Ich stelle mir etwas wie folgt vor:

public class Customer
{
  public Customer(int id, string name)
  {
    Id = id;
    Name = name;
  }

  [CtorParam("id")]
  public int Id { get; set; }

  [CtorParam("name")]
  public string Name { get; set; }
}

Aber keines der MSDN-Dokumente informiert wirklich darüber, wie Members genau initialisiert wird.

6voto

Marc Gravell Punkte 970173

Mein beschränktes Verständnis besagt, dass Sie normalerweise nicht die Mitgliederinformationen übergeben müssen; die Argumente werden (nach Position) aus dem Argumente Parameter übernommen. Die Mitglieder-Informationen sind (vermute ich) dazu gedacht, einigen internen APIs zu helfen, wenn es um Dinge wie anonyme Typen geht, die in C# so aussehen, als würden sie nach Mitglied (wie bei einem Objekt-Initialisierer) initialisiert, tatsächlich aber durch Konstruktor initialisiert werden. Dies bedeutet, dass Dinge wie LINQ-to-SQL eine Konstruktor-Verwendung sehen und dann (im nächsten Teil der Abfrage) auf obj.Name zugreifen - es muss eine Möglichkeit geben, zu verstehen, dass dies "den 3. Parameter des Konstruktors bedeutet (der nie tatsächlich aufgerufen wird). Insbesondere für Dinge wie Gruppierungen.

Also ist das in Ordnung:

        var param = Expression.Parameter(typeof(string), "Name");
        var body = Expression.New(typeof(Customer).GetConstructor(new[] {typeof(int), typeof(string)}),
            Expression.Constant(1), param);
        var func = Expression.Lambda>(body, param).Compile();
        var cust = func("abc");

Wenn Sie sie benötigen, würde ich erwarten, dass sie relativ zu den "Argumenten" Ausdrücken positionell sind - also würden Sie (in einem Array) das Mitglied für die Id und den Namen übergeben. Beachten Sie, dass es auch einen getrennten Ausdruck für die Initialisierungsstil-Bindung gibt.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X