一个通用的解决方案?

时间:2014-12-10 19:46:07

标签: c# generics nullable

我想按照以下几行编写泛型方法:

public IEnumerable<T> S<T> (List<T> source)
{
    //dosomething with source
    if (someCondition)
        yield return null;
    else
        yield return someNonNullItem;
}

T可以是值类型(例如int),可空类型(例如int?)或ref类型(例如字符串)。在所有这三种情况下,我希望能够返回空值。

// dosomething块非常通用,涉及到移动的东西,并且可以在没有修改的情况下用于所有类型。类似地,(someCondition)布尔检查没有任何类型依赖。

一些注意事项:

  1. 我不能使用默认值(T),其中T是一个不可为空的值类型(例如,默认值(T),其中T为int won not work)。需要显式表示null。
  2. 我不想从T转换为T?如果我可以避免它,因为源列表可能很长(数百万项)。
  3. 目前,我不得不写三个函数,其中一个必须有不同的名称(因为类型约束不被视为方法签名的一部分)。这三个功能具有相同的主体(为简洁起见未示出)。

        public IEnumerable<T?> S<T>(List <T> source) where T:struct
        {
        }
    
        public IEnumerable<T?> S<T>(List <T?> source) where T : struct
        {
        }
    
        public IEnumerable<T> S4Ref<T>(List <T> source) where T : class
        {
        }
    

    在前两个方法中,我需要T:struct约束才能返回Nullable。在第三种方法中:(a)我需要一个新名称S4Ref,以避免与第一种方法发生冲突,并且,(b)我需要T:类约束才能返回null。

    实际上,我必须编写很多这样的S方法,如果我遵循上述方法,我将不得不为每个方法编写三个版本。我还将它们转换为List

    的扩展方法

    问题:

    1. 有没有办法让一个通用函数执行此操作?或者至少减少3到2种方法?
    2. 如果没有,消除功能体中重复的最佳方法是什么?
    3. 目前我正在转向使用T4模板来解决这个问题。

0 个答案:

没有答案