在函数中添加类型的参数,以及类型的实现条件

时间:2015-07-26 11:34:25

标签: c# inheritance types params

我想用一些棘手的输入参数编写一个函数: 这将是一个类型的参数,这些类型应该实现一个特定的接口。 签名看起来像是:

function void myFunction(string t,params Type[] types) where types:IMyInterface

当然,它并不像那样工作。

请不要建议通用类型,我希望有几种类型,而且我不知道有多少类型。

1 个答案:

答案 0 :(得分:0)

您无法强制编译器在不使用泛型的情况下为您执行编译时检查。由于泛型不提供用于处理此类型参数列表的可变语法,因此常见的解决方法是提供具有不同数量类型参数的泛型的多个重载,然后调用常见实现:

void myFunction(string t) {
    myFunctionImpl(t, new Type[0]);
}
void myFunction<T0>(string t) where T0:IMyInterface {
    myFunctionImpl(t, new[] { typeof(T0) });
}
void myFunction<T0,T1>(string t) where T0:IMyInterface,
                                       T1:IMyInterface {
    myFunctionImpl(t, new[] { typeof(T0), typeof(T1) });
}
...
void myFunction<T0,T1,T2,T3,T4,T5,T6,T7,T8,T9>(string t)
    where T0:IMyInterface,
          T1:IMyInterface,
          T2:IMyInterface,
          T3:IMyInterface,
          T4:IMyInterface,
          T5:IMyInterface,
          T6:IMyInterface,
          T7:IMyInterface,
          T8:IMyInterface,
          T9:IMyInterface {
    myFunctionImpl(t, new[] { typeof(T0), typeof(T1), typeof(T2), typeof(T3), typeof(T4), typeof(T5), typeof(T6), typeof(T7), typeof(T8), typeof(T9) });
}

此方法可让您根据需要使用最多十个类型参数调用myFunction