【发布时间】:2011-02-25 10:36:37
【问题描述】:
如果我有以下类型层次结构:
abstract class TicketBase
{
public DateTime PublishedDate { get; set; }
}
class TicketTypeA:TicketBase
{
public string PropertyA { get; set; }
}
class TicketTypeB:TicketBase
{
public string PropertyB { get; set; }
}
还有更多TicketTypes : TicketBase
并想要创建一个选择任何属性的函数,例如PropertyA 来自任何票证类型,例如TicketTypeA
我写了这个函数:
private Func<TicketBase, String> CreateSelect(Type t, String FieldName)
{
var parameterExp = Expression.Parameter(t, "sel");
var fieldProp = Expression.PropertyOrField(parameterExp, FieldName);
var lambda = Expression.Lambda<Func<TicketBase, String>>(fieldProp, parameterExp);
return lambda.Compile();
}
并像这样在List<TicketBase> Tickets 上调用它:
Type typeToSelectFrom = typeof(TicketTypeA);
String propertyToSelect = "PropertyA";
Tickets.Select(CreateSelect(typeToSelectFrom, propertyToSelect));
我得到以下 ArgumentException:
ParameterExpression of type 'TicketTypes.TicketTypeA' cannot be used for delegate parameter of type 'Types.TicketBase'
有人知道如何解决这个问题吗?
【问题讨论】:
标签: linq lambda runtime compilation expression-trees