【发布时间】:2009-08-06 20:38:01
【问题描述】:
有人可以解释为什么以下两个示例中的第一个有效而另一个无效吗?更具体地说,在第一个示例中,T 和 TProperty 之间的关系是如何创建的?
//Example 1
class SomeClass<T> where T : class
{
void SomeMethod<TProperty>( Expression<Func<T,TProperty>> expression ){ ... }
}
//Example 2
class SomeClass
{
void SomeMethod<T,TProperty>( Expression<Func<T,TProperty>> expression )
where T : class{ ... }
}
鉴于这两个示例,我希望以下实现会起作用,但第二个不会。
//Implementation w/ Example 1
var sc = new SomeClass<MyDateClass>();
sc.SomeMethod( dt => dt.Year );
//Implementation w/ Example 2
var sc = new SomeClass();
sc.SomeMethod<MyDateClass>( dt => dt.Year );
我难以理解的是第一个示例/实现如何在执行 SomeMethod 时忽略 TProperty 泛型类型,但第二个示例/实现不能以及如何在 T 之间建立隐式关系以及示例/实现 1 中的 TProperty。
解决方案 更改示例 2 中方法的签名如下:
void SomeMethod<T>( Expression<Func<T,Object>> expression ){ ... }
虽然这将允许在表达式中使用任意对象,因此它确实允许如实现 2 中所述的属性连接。
【问题讨论】: