首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将泛型参数约束为抽象参数

问将泛型参数约束为抽象参数
EN

Stack Overflow用户
提问于 2016-03-22 18:07:08
回答 1查看 59关注 0票数 1

是否可以为C#泛型参数指定约束,其中该参数必须是抽象的?所以我目前有一个方法,其中的泛型参数必须有一个无参数的构造函数,但是我现在遇到了一个需要抽象T的场景,所以我希望用一个只接受抽象T的方法来重载这个方法

代码语言:javascript
复制
public static void SomeMethod<T>(IEnumberable<T> SomeParam) where T:SomeBase, new()
{
  T tThing = new T();
  //do something simple
}
public static T SomeOtherMethod<T>(IEnumberable<T> SomeParam) where T:SomeBase, new()
{
  T tThing = new T();
  //do something simple
}

public static void SomeMethod<T>(IEnumberable<T> SomeParam) where T:SomeBase, abstract()
{
 //do something clever
}
public static T SomeOtherMethod<T>(IEnumberable<T> SomeParam) where T:SomeBase, abstract()
{
 //do something clever
}

如果像我怀疑的那样,答案是“你不能这样做”,那么有没有什么明智的变通办法呢?

EN

回答 1

Stack Overflow用户

发布于 2016-03-22 18:23:40

不能指示编译器检查类型参数是否为抽象参数。但是你可以做一个运行时检查。

代码语言:javascript
复制
public static void SomeMethod<T>(IEnumerable<T> SomeParam) where T:SomeBase
{
    Type type = typeof(T);
    if(type.IsAbstract)
    {
        throw new Exception(string.Format("Cannot use SomeMethod with type {0} because it is abstract.", type.FullName)); 
    }

    // Do the actual work
}

或者:

代码语言:javascript
复制
public static void SomeMethod<T>(IEnumerable<T> SomeParam) where T:SomeBase
{
    Type type = typeof(T);
    if(type.IsAbstract)
    {
        SomeMethodAbstract<T>(SomeParam);
    }
    else
    {
        SomeMethodNonAbstract<T>(SomeParam);
    }
}
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/36151409

复制
相关文章

相似问题

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