【发布时间】:2011-05-03 06:58:07
【问题描述】:
我想为属于特定类型的特定属性“包装”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();
}
正如预期的那样,我得到了以下异常:
“MyConcreteClass”类型的参数表达式不能用于 'MyAbstractClass
' 类型的委托参数。
有没有办法“强制”这种铸造?提前致谢。
【问题讨论】:
-
这个问题非常令人困惑。为什么会有一个名为“MyConcreteClass”的抽象类。 “具体”和“抽象”是对立的;这是故意混淆视听吗?两个“T”是相同的,还是在两个不同的类中有两个不同的 T 声明?你为什么要首先尝试做这种奇怪的事情?