c# – Lambda Expression:将参数转换为基类型

前端之家收集整理的这篇文章主要介绍了c# – Lambda Expression:将参数转换为基类型前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我想“包装”特定属性的getter函数,该属性是特定类型的一部分.
我有一个抽象类,定义如下:
public abstract class MyAbstractClass<T> where T : MyType
{
    // ...
}

好吧,假设我有一个类似下面的具体类:

public abstract class MyConcreteClass : MyAbstractClass<MyConcreteType>
{
    // ...
}

现在,应该返回getter方法的包装器的辅助方法

private Func<MyAbstractClass<T>,Object> GetPropertyGetter(PropertyInfo property)
{
    var instanceType = Expression.Parameter(property.DeclaringType,"i");

    // Taking getter's "body".
    var getterBody = Expression.Property(instanceType,property);

    // Cast to a generic Object.
    var body = Expression.TypeAs(getterBody,typeof(Object));

    // Build the expression.
    var exp = Expression.Lambda<Func<MyAbstractClass<T>,Object>>(body,instanceType);
    return exp.Compile();
}

就像预期的那样,我得到以下异常:

ParameterExpression of type ‘MyConcreteClass’ cannot be used for
delegate parameter of type ‘MyAbstractClass<MyConcreteType>’.

有没有办法“强迫”这种铸造?提前致谢.

解决方法

如果我正确理解你的问题,你想创建一个像这样的lambda表达式:
Func<MyAbstractClass<T>,Object> f = i => ((MyConcreteClass)i).SomeProperty;

除非您想提供SomeProperty属性作为参数.好吧,如果你想以编程方式构建该表达式,你必须完全相同:使用表达式参数i(类型为MyAbstractClass< T>),将其转换为MyConcreteClass,然后访问属性SomeProperty.

public Func<MyAbstractClass<T>,Object> GetPropertyGetter(PropertyInfo property)
{
    var parameter = Expression.Parameter(typeof(MyAbstractClass<T>),"i");

    var cast = Expression.TypeAs(parameter,property.DeclaringType);

    var getterBody = Expression.Property(cast,property);

    var exp = Expression.Lambda<Func<MyAbstractClass<T>,Object>>(
        getterBody,parameter);

    return exp.Compile();
}

话虽如此,我完全不知道你为什么要那样做,所以你最好确定这是你想要做的事情,没有更好的办法去做你真正想做的事情.

猜你在找的C#相关文章