-背景
我有以下5个对象
IChangeStatus<T>
myFirstClass : IChangeStatus<firstClassEnum>
mySecondClass : IChangeStatus<secondClassEnum>
myClassHandler<TEntity>
myFirstClassHandler : myClassHandler<myFirstClass>为了解决这个问题,我们可以假设接口只具有以下属性
T Status { get; }-问题
1.-如何在myClassHandler中询问TEntity实例是否实现了IChangeStatus
2.-假设IEnumerable of TEntity的特定IChangeStatus,我如何迭代它们?
发布于 2014-04-09 20:36:22
我找到了另一个因此,请检查类型是否实现了泛型接口,而不考虑泛型类型参数。,它给了我一个更通用的答案,这就是我想要的答案:
return entity.GetType().GetInterfaces()
.Where(i => i.IsGenericType)
.Any(i => i.GetGenericTypeDefinition() == typeof(IChangeStatus<>));对于假设特定类型的IEnumerable上的迭代,因为我们得到了这个值,所以类型实现了接口,因此具有一个状态属性.所以我选择了动态类型。
发布于 2014-04-07 17:12:06
要检查类是否实现了IChangeStatus,只需执行以下操作:
public void FooMethod(ClassType myClass)
{
var doesImplementIChange = myClass as IChangeStatus<SomeClass>
if (doesImplementIChange != null)
{
// Do stuff..
}
}迭代类的IEnumerable:
foreach (var data in myClass.OfType<MyType>())
{
// Do stuff..
}或者,你可以:
foreach (var cls in myClass)
{
var myCls = myClass as IChangeStatus<SomeClass>;
if (myCls != null)
{
// Do stuff..
}
}发布于 2014-04-07 17:16:56
如果要在T中使用来自IChangeStatus<T>的MyClassHandler,则必须添加另一个类型参数。例如:
class MyClassHandler<TEntity, TStatus>
where TEntity : IChangeStatus<TStatus>
{
public IEnumerable<TStatus> Statuses
{
get { return _entities.Select(entity => entity.Status); }
}
}where子句将确保实体和状态类型是相关的。
如果不想这样做,可以添加一个额外的非泛型接口,该接口公开Status类型的Object属性。这样会丢失一些静态类型,但是不需要额外的类型参数。
https://stackoverflow.com/questions/22918577
复制相似问题