Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/287.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 一种接受不同参数的方法_C#_.net - Fatal编程技术网

C# 一种接受不同参数的方法

C# 一种接受不同参数的方法,c#,.net,C#,.net,使用FW 4.5.1我有一个方法: void DoSomething(string s) 我想让函数也接受int,但是在相同的参数s下。这意味着我想写: void DoSomething(var s) 有时s将是int,有时是string 如何实现这一点?您可以通过重载实现您想要的 void DoSomething(string s){ DoSomething(int.Parse(s)); } void DoSomething(int s){ /* Your code here */ }

使用
FW 4.5.1
我有一个方法:

void DoSomething(string s)
我想让函数也接受
int
,但是在相同的参数s下。这意味着我想写:

void DoSomething(var s)
有时
s
将是
int
,有时是
string


如何实现这一点?

您可以通过重载实现您想要的

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()); }
你可以使用泛型

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 MyMethod(T参数)
{
if(typeof(T)=typeof(int))
{
//对象是一个int
}
else if(typeof(T)=typeof(string))
{
//对象是一个字符串
}
}

三个选项供你考虑,取决于你实际上想要达到的:

使用重载 这将只接受
int
string
——这可能是好事,也可能是坏事,这取决于您试图实现的目标。如果您真的只想接受
int
string
,这是最好的解决方案

使用
对象
这将允许您传入任何内容

使用泛型
public void DoSomething(T值){…}

这仍然允许您传入任何内容,但如果(比如)您以后想要接受两个必须是相同类型(或至少兼容类型)的值,则将提供更多的类型安全性

如果代码内部类似,请使用@juunas建议的方法重载,或使用@Jon Skeet建议的
object

如果您有很多公共代码,请使用方法重载将其转换为可接受的格式,然后调用公共方法。显然,如果通用格式是
string
int
,那么只需使用方法重载即可

void DoSomethingCommon(/*SomeCommonThing*/ thing)

重载在99.9999%的情况下都是正确的答案,但这里还有另一个答案。这比使用
对象
稍微好一点,因为如果调用方不提供值类型,它将导致编译时错误

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

void DoSomething(对象s)
或只是重载它:写入
void DoSomething(int x)
以及
void DoSomething(字符串s)
。如果您只想让它处理
int
和'string',这更合适。或者可以使用泛型。为什么要允许
int
string
string
-重载是否只是执行一个简单的
int.Parse
?;这意味着变量只有一种类型,编译器在编译时从上下文推断该类型,而不是由程序员显式声明。这是相对容易的(对于“easy”的某些值),变量声明一次;对于函数,他们给了我们泛型。@EdPlunkett别忘了,……这正是我的目标。马上检查。谢谢。这对我来说并不是非常“通用”,因为它只处理两种类型-如果只支持两种类型,我会使用重载。我会在这里创建两种不同的方法,如果你在泛型上执行的代码是不同的,那么使用泛型是没有意义的。Reed@JonSkeet我确信OP只需要一个方法,但是如果没有OP想要修改的实际方法,就无法建议更好的实现。注意:类是否真的负责处理“损坏的”输入参数,还是调用方有责任提供有效的输入?其目的是提供向后兼容性,因此代码中调用此函数的100个位置需要平滑。@Itay.B感谢您的澄清-但是,我建议以后遵循以摆脱扩展类(这应该是您重构任务的最终目标)-尽管如此,这个问题超出了您的问题范围:)但是我必须复制方法的内容吗?60行代码。@Itay.B然后在转换为公共类型后使用公共方法,或者使用已经建议的答案之一。我认为最好编辑答案,使重载位于顶部,因为这是您认为的答案best@TheLethalCoder:完成-尽管这在很大程度上取决于上下文,我们没有太多的。。。
public void DoSomething<T>(T value) { ... }
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)
void DoSomethingCommon(/*SomeCommonThing*/ thing)
static void DoSomething(IConvertible input)
{
    if (input is int)
    {
        //Do something
    }
    if (input is string)
    {
        //Do something
    }
    //etc....
}