对参数的约束

时间:2012-03-15 21:26:37

标签: c# constraints params

我有一个记录数据的方法,并使用params关键字

获取大量输入
public static void LogData<T>(params object[] parameter)
{
    // log out the data
}

我想限制字符串和数字类型的输入,我首先想到的是使用where子句。显而易见的问题是你不能在where子句中使用具体类型,但你可以通过注意到字符串和数字类型都是IComparable和IConvertible来解决这个问题。我认为这可能会有所帮助:

public static void LogData<T>(params T[] parameter)
    where T : IComparable, IConvertible
{
    // log out the data
}

这不起作用,因为所有输入都必须是一种类型。

有没有办法使用params关键字或其他语法限制字符串和数字类型的输入?

4 个答案:

答案 0 :(得分:1)

当每个对象都有ToString方法时,我不确定为什么要这样做。

无论如何,您可以声明一个新类 - NumberOrString,它将支持字符串的隐式转换以及您想要支持的数字类型。然后让您的LogData方法接受params NumberOrString[] p

答案 1 :(得分:0)

如果你在谈论strings numeric类型,那是不可能的。如果条件为,您可以定义optional parameter类型List<T>,其中T是任何选定的数字类型。

答案 2 :(得分:0)

我使用我想支持的类型创建多个基本上都是重载的方法。 可能是代码太多而重复,但基本的“注销数据”例程基本上会在所有重载中重复使用。

答案 3 :(得分:0)

这是一个潜在的解决方案:

public static void LogData(params IConvertible[] parameter)
{
    // log out the data
}

虽然我想知道是否有任何理由你需要对象是IComparable或IConvertible,或者你只是想将它们限制为已知类型(即字符串或数字)。我认为zmbq的答案可能是要走的路。或者您甚至可能只想查看对象是否实现了有用的ToString方法。 Here's a way找出它(不是编译时限制,正如您所期望的那样,但在运行时使用反射)。