C# 检查object类型的参数是否转换为整数或字符串

C# 检查object类型的参数是否转换为整数或字符串,c#,casting,C#,Casting,我有一个方法,我想作为双重用途,这取决于所传递的参数实际上是整数还是字符串值 如何检查下面的“info”是整数还是字符串值 public void Place (object info){ } 我知道重载,但由于一些原因,我将不深入讨论无法更改调用方法。始终传递类型“object”。有点笨拙,但要测试整型和字符串转换值 不要使用对象作为参数,更好的选择是重载该方法 public void Place (string info){ ... } public void Place (int

我有一个方法,我想作为双重用途,这取决于所传递的参数实际上是整数还是字符串值

如何检查下面的“info”是整数还是字符串值

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。真奇怪。。。签名不能更改,但代码可以更改。那么在这种情况下,你也可以用它作为包装器