C# 检查object类型的参数是否转换为整数或字符串
我有一个方法,我想作为双重用途,这取决于所传递的参数实际上是整数还是字符串值 如何检查下面的“info”是整数还是字符串值C# 检查object类型的参数是否转换为整数或字符串,c#,casting,C#,Casting,我有一个方法,我想作为双重用途,这取决于所传递的参数实际上是整数还是字符串值 如何检查下面的“info”是整数还是字符串值 public void Place (object info){ } 我知道重载,但由于一些原因,我将不深入讨论无法更改调用方法。始终传递类型“object”。有点笨拙,但要测试整型和字符串转换值 不要使用对象作为参数,更好的选择是重载该方法 public void Place (string info){ ... } public void Place (int
public void Place (object info){
}
我知道重载,但由于一些原因,我将不深入讨论无法更改调用方法。始终传递类型“object”。有点笨拙,但要测试整型和字符串转换值 不要使用
对象
作为参数,更好的选择是重载该方法
public void Place (string info){ ... }
public void Place (int info){ ... }
如果由于某种原因无法更改方法签名,则需要执行以下操作:
public void Place(object info)
{
if(info is int){
int result = (int)info;
...
}
else if (info is string){
string result = (string)info;
...
}
}
或者,将其作为一种通用方法,如
public void Place<T> (T info)
{
// your code here
}
公共空地(T信息)
{
//你的代码在这里
}
您可以将其称为关闭类型,如
Place(23)
或只是Place(23)
C#7.0引入了模式匹配。这将启用基于特定类或结构的匹配。因为您不能更改方法的签名,所以这是目前最好的选择
如果测试成功,则使用is
表达式分配变量会使代码变得更简单:
public void Place( object info )
{
if ( info is string infoString )
{
// use infoString here
}
else if ( info is int infoInt )
{
// use infoInt here
}
}
If语句仅限于测试输入以匹配特定的单一类型。如果要测试特定情况,开关模式匹配将成为更好的选择:
public void Place( object info )
{
switch ( info )
{
// handle a specific case
case string infoString when infoString.Contains( "someInfo" ):
// do something
break;
case string infoString:
// do something
break;
case int infoInt when infoInt > 10:
// do something
break;
case int infoInt:
// do something
break;
default:
// handle any other case
break;
}
}
重载该方法如何?Integer.TryParse:。虽然,迂腐地说,一个错误的结果只是证明它不是一个int32,并不是说它是任何其他类型的数字都不可解析的。任何东西都可以是字符串。您的意思是它必须只能解释为字符串,还是不能解释为int?P.S.Puropoix建议的重载可以说是一种更干净、更清晰的方法。
if(info is int)
is关键字就是为了这个目的而设计的。是的,我知道重载,但出于我不想讨论的原因,我无法更改调用方法。始终传递类型“object”。有点笨拙,但要测试整型和字符串转换值。@eco_bach你应该从一开始就对此提出质疑。我是为你做的。。。请尝试在将来将所有信息放入问题中。结果是OP无法更改签名。。。另外,我认为它在根据类型为Place
方法提供不同版本的代码方面没有多大帮助,只是使类型更容易获得-仍然需要某种类型的if
来检查类型。@AlexeiLevenkov。真奇怪。。。签名不能更改,但代码可以更改。那么在这种情况下,你也可以用它作为包装器