一种接受不同参数的方法

时间:2017-01-10 14:13:03

标签: c# .net

使用FW 4.5.1我有一个方法:

void DoSomething(string s)

我想允许函数接受int,但是在相同的参数下。这意味着我想写:

void DoSomething(var s)

有时sint,有时为string

我怎样才能做到这一点?

5 个答案:

答案 0 :(得分:18)

您需要考虑三个选项,具体取决于您实际尝试实现的目标:

使用重载

public void DoSomething(int s) { ... }
public void DoSomething(string s) { ... }

这将接受intstring - 这可能是好事还是坏事,具体取决于您尝试实现的目标。如果您真的只想接受intstring,这是IMO的最佳解决方案。

使用object

public void DoSomething(object s) { ... }

这将允许您传递任何内容。

使用泛型

public void DoSomething<T>(T value) { ... }

这仍然允许您传入任何内容,但是如果(比方说)您希望稍后接受两个值必须是相同类型(或至少兼容类型)

答案 1 :(得分:11)

你可以通过重载达到你想要的效果。

void DoSomething(string s){ DoSomething(int.Parse(s)); }
void DoSomething(int s){ /* Your code here */ }

或者相反:

void DoSomething(string s){ /* Your code here */ }
void DoSomething(int s){ DoSomething(s.ToString()); }

答案 2 :(得分:5)

您可以使用泛型

void MyMethod<T>(T param)
{
    if (typeof(T) == typeof(int))
    {
        // the object is an int
    }
    else if (typeof(T) == typeof(string))
    {
        // the object is a string
    }
}

答案 3 :(得分:1)

你说仿制品就是你所追求的(引用这里的代码作为参考):

void MyMethod<T>(T param)
{
    if (typeof(T) == typeof(int))
    {
        // the object is an int
    }
    else if (typeof(T) == typeof(string))
    {
        // the object is a string
    }
}

但是,这并不是非常通用的,实际上根据类型执行两种不同的操作。这告诉我你可能只想要两种不同的方法:

void DoSomethingWithString(string s)

void DoSomethingWithInt(int n)

如果代码在内部类似,虽然使用方法重载为@juunas建议或使用object作为@Jon Skeet建议。

如果您有很多常用代码,请使用方法重载转换为可接受的格式,然后调用常用方法。显然,如果常见格式是stringint,那么只需使用方法重载。

void DoSomethingCommon(/*SomeCommonThing*/ thing)

答案 4 :(得分:1)

超载是99.9999%的正确答案,但对于它的地狱,这是另一个答案。这比使用object略好,因为如果调用者没有提供值类型,它将导致编译时错误。

static void DoSomething(IConvertible input)
{
    if (input is int)
    {
        //Do something
    }
    if (input is string)
    {
        //Do something
    }
    //etc....
}