c# – Lambda Expression:将参数转换为基类型
发布时间:2020-12-15 07:56:18 所属栏目:百科 来源:网络整理
导读:我想“包装”特定属性的getter函数,该属性是特定类型的一部分. 我有一个抽象类,定义如下: public abstract class MyAbstractClassT where T : MyType{ // ...} 好吧,假设我有一个类似下面的具体类: public abstract class MyConcreteClass : MyAbstractCla
我想“包装”特定属性的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(); } 就像预期的那样,我得到以下异常:
有没有办法“强迫”这种铸造?提前致谢. 解决方法
如果我正确理解你的问题,你想创建一个像这样的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(); } 话虽如此,我完全不知道你为什么要那样做,所以你最好确定这是你想要做的事情,没有更好的办法去做你真正想做的事情. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |