首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >推断通用接口类型

推断通用接口类型
EN

Stack Overflow用户
提问于 2014-04-07 16:57:01
回答 3查看 150关注 0票数 0

-背景

我有以下5个对象

代码语言:javascript
复制
IChangeStatus<T>
myFirstClass : IChangeStatus<firstClassEnum>
mySecondClass : IChangeStatus<secondClassEnum>

myClassHandler<TEntity>
myFirstClassHandler : myClassHandler<myFirstClass>

为了解决这个问题,我们可以假设接口只具有以下属性

代码语言:javascript
复制
T Status { get; }

-问题

1.-如何在myClassHandler中询问TEntity实例是否实现了IChangeStatus

2.-假设IEnumerable of TEntity的特定IChangeStatus,我如何迭代它们?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2014-04-09 20:36:22

我找到了另一个因此,请检查类型是否实现了泛型接口,而不考虑泛型类型参数。,它给了我一个更通用的答案,这就是我想要的答案:

代码语言:javascript
复制
return entity.GetType().GetInterfaces()
       .Where(i => i.IsGenericType)
       .Any(i => i.GetGenericTypeDefinition() == typeof(IChangeStatus<>));

对于假设特定类型的IEnumerable上的迭代,因为我们得到了这个值,所以类型实现了接口,因此具有一个状态属性.所以我选择了动态类型。

票数 0
EN

Stack Overflow用户

发布于 2014-04-07 17:12:06

要检查类是否实现了IChangeStatus,只需执行以下操作:

代码语言:javascript
复制
public void FooMethod(ClassType myClass)
{
  var doesImplementIChange = myClass as IChangeStatus<SomeClass>
  if (doesImplementIChange != null)
  {
    // Do stuff..
  }
}

迭代类的IEnumerable:

代码语言:javascript
复制
foreach (var data in myClass.OfType<MyType>())
        {
            // Do stuff..
        }

或者,你可以:

代码语言:javascript
复制
foreach (var cls in myClass)
        {
            var myCls = myClass as IChangeStatus<SomeClass>;
            if (myCls != null)
            {
                // Do stuff..
            }
        }
票数 2
EN

Stack Overflow用户

发布于 2014-04-07 17:16:56

如果要在T中使用来自IChangeStatus<T>MyClassHandler,则必须添加另一个类型参数。例如:

代码语言:javascript
复制
class MyClassHandler<TEntity, TStatus>
    where TEntity : IChangeStatus<TStatus>
{
     public IEnumerable<TStatus> Statuses
     {
          get { return _entities.Select(entity => entity.Status); }
     }
}

where子句将确保实体和状态类型是相关的。

如果不想这样做,可以添加一个额外的非泛型接口,该接口公开Status类型的Object属性。这样会丢失一些静态类型,但是不需要额外的类型参数。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/22918577

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档