Auf die Antwort auf meine Frage reagieren Wählen Sie eine Modelleigenschaft mit einem Lambda und nicht mit einer Frage zum Namen der Zeichenfolgeeigenschaft aus , um einer Sammlung Eigenschaften wie folgt hinzuzufügen:
var props = new ExportPropertyInfoCollection<JobCard>();
props.Include(model => model.BusinessInstallNumber).Title("Install No").Width(64).KeepZeroPadding(true);
props.Include(model => model.DeviceName).Title("Device").Width(70);
props.Include(model => model.DateRequested).Title("Request Date").Format("{0:dd/MM/yyyy}").Width(83);
Ich habe den folgenden Code in die Include
Methode geschrieben:
public class PropertyCollection<T>
{
public void Include(Expression<Func<T, object>> expression)
{
var memberExpression = expression.Body as MemberExpression;
if (memberExpression != null)
{
var pes = new ExportPropertyInfoBuilder {Property = new ExportPropertyInfo {Property = memberExpression.Member as PropertyInfo}};
Properties.Add(pes.Property.Property.Name, pes.Property);
return pes;
}
Um jedoch den Code auf ausgeführt wird , fand ich das lambda einig ergab Member Werte wie erwartet, aber andere ergaben UnaryExpression Werte. Ich musste die erste Codezeile wie folgt ändern, bevor ich alle meine Eigenschaften mit Lambdas hinzufügen konnte:
var memberExpression = expression.Body as MemberExpression ?? ((UnaryExpression) expression.Body).Operand as MemberExpression;
Alle Eigenschaften sind 'einfache' Typen, dh Zeichenfolge, DateTime, int, bool usw. in einem POCO-Geschäftsobjekt. Sie sind mit verschiedenen DataAnnotations- Attributen versehen.
Was bewirkt, dass einige der Lambdas in meinem Beispiel MemberExpression- Werte und andere UnaryExpression- Werte liefern? In meinem Beispiel befindet sich die erste UnaryExpression in der dritten Zeile, der DateTime- Eigenschaft, aber boolesche Eigenschaften führen auch zu UnaryExpressions .
quelle
MemberExpression
solche Ausdrücke schon einmal verwendet (oder eher missbraucht) und hatte nie Probleme, was bedeutet, dass mein Code immer fehlschlagen würde. Auf welcher .NET-Version laufen Sie? Ich benutze .NET 4 noch nicht.Include
angeben , der erwartet wird? (einschließlich Einschränkungen)Antworten:
Ich glaube ich weiß was das Problem ist. Ihr Ausdruck gibt den Typ zurück
object
.Wenn Sie dies in
Expression<Func<T, R>>
den Rückgabetyp ändern, sollte dieser korrekt abgeleitet werden undUnaryExpression
(von dem ich annehme, dass es sich um eine Boxoperation handelt) nicht auftreten.Aktualisieren:
Die Unterschrift für
Include
sollte sein:public void Include<T, R>(Expression<Func<T, R>> expression)
quelle