简体   繁体   English

动态创建Expression.Lambda的通用类型

[英]Dynamically create generic type of an Expression.Lambda

I would like to create lambda expressions, type: 我想创建lambda表达式,输入:

Expression.Lambda <Func<T,TProperty>>

but without knowing the TProperty, to save them in a collection. 但不知道TProperty,将其保存在集合中。

public BuilderMapping<T> AutoMap()
{
    var type = typeof(T);
    var props = type.GetProperties(BindingFlags.Public);
    foreach (var propertyInfo in props)
    {
        var param = Expression.Parameter(typeof(T));
        var body = Expression.PropertyOrField(param, propertyInfo.Name);

        // propertyInfo.PropertyType == TProperty
        //  I have not TProperty
        var exp = Expression.Lambda<Func<T, TProperty>>(body, param);

        var prop = new PropertyDescriptor<T, TProperty>
        {
            Selector = exp
        };
        _descriptorColumn.Add(prop);
    }
    return this;
}
var delegateType = typeof(Func<,>).MakeGenericType(typeof(T), propertyInfo.PropertyType);
var exp = Expression.Lambda(delegateType, body, param);

PropertyDescriptor<T, TProperty> will need similar treatment, I think the shortest way would be this: PropertyDescriptor<T, TProperty>将需要类似的处理,我认为最短的方法是这样的:

dynamic prop = Activator.CreateInstance(typeof(PropertyDescriptor<,>).MakeGenericType(typeof(T), propertyInfo.PropertyType));
prop.Selector = (dynamic)exp;

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM