Должно быть легко ...Как проверить, является ли тип IEnumerable <BaseType>?
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));
}
}
Можете ли вы действительно не придумать лучшего имени для функции, чем «Бар»? – Timwi
@ Тимви, что насчет 'Баз'? –
@Arnis: Сколько фрагментов кода вы видели, у которых есть такие имена функций? Можете ли вы честно не думать о имени, которое * описывает функцию *? – Timwi