使用FW 4.5.1
我有一个方法:
void DoSomething(string s)
我想允许函数接受int
,但是在相同的参数下。这意味着我想写:
void DoSomething(var s)
有时s
为int
,有时为string
。
我怎样才能做到这一点?
答案 0 :(得分:18)
您需要考虑三个选项,具体取决于您实际尝试实现的目标:
public void DoSomething(int s) { ... }
public void DoSomething(string s) { ... }
这将仅接受int
和string
- 这可能是好事还是坏事,具体取决于您尝试实现的目标。如果您真的只想接受int
和string
,这是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建议。
如果您有很多常用代码,请使用方法重载转换为可接受的格式,然后调用常用方法。显然,如果常见格式是string
或int
,那么只需使用方法重载。
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....
}