【发布时间】:2010-09-26 12:34:02
【问题描述】:
应该很容易...
class Base{}
class Foo:Base{}
public bool Bar(Type t){
// return ???
// NB: shouldn't know anything about Foo, just Base
}
Assert.True(Bar(typeof(IEnumerable<Foo>));
Assert.False(Bar(typeof(IEnumerable<Base>));
Assert.False(Bar(typeof(string));
Assert.False(Bar(typeof(Foo));
只是为了回答为什么第二个应该是错误的问题(实际上 - 没关系,因为 Bar 参数永远不会是 IEnumerable<Base>)。
我正在尝试编写 FluentNhibernate 自动映射约定,它将我的类枚举映射到整数。我已经成功地做到了,但是当我想映射 IEnumerable<EnumerationChild>(在我的例子中是 User.Roles)时事情就失败了。
public class EnumerationConvention:IUserTypeConvention{
private static readonly Type OpenType=typeof(EnumerationType<>);
public void Apply(IPropertyInstance instance){
//this is borked atm, must implement ienumerable case
var closedType=OpenType.MakeGenericType(instance.Property.PropertyType);
instance.CustomType(closedType);
}
public void Accept(IAcceptanceCriteria<IPropertyInspector> criteria){
criteria.Expect(
x=>typeof(Enumeration).IsAssignableFrom(x.Property.PropertyType) ||
typeof(IEnumerable<Enumeration>)
.IsAssignableFrom(x.Property.PropertyType));
}
}
【问题讨论】:
-
你真的不能想出一个比
Bar更好的函数名吗? -
@Timwi
Baz怎么样? -
@Arnis:你见过多少段代码有这样的函数名?你真的想不出一个描述函数的名字吗?
-
@Timwi 我不确定您要达到的目标。我认为在提问时使用元句法变量是个好主意。想法是强迫人们理解代码的结构而不是它的目的。如果我明确询问有关 FNH 自动映射和类枚举器的问题 - 我会等待数周才能得到答案。
-
@Arnis:该功能与 FNH 自动映射无关。您的问题是“对于派生自
Base的某些T,如何确定类型t是否为IEnumerable<T>”。当然,调用类似IsIEnumerableBaseDerived或类似的函数比Bar清晰一百万倍。
标签: c# c#-4.0 types ienumerable