2014-07-11 35 views
0

我正在创建一个基本类,该类具有用户可设置属性,该属性必须是int类型。我该如何去检查用户传入的类型实际上是一个整数,并且如果它是某种其他类型则抛出异常?在属性赋值期间使用typeof检查值的类型

class MyClass 
{ 
    private int _amount; 

    public int Amount 
    { 
     get 
     { 
      return _amount; 
     } 
     set 
     { 
      Type t = typeof(value); 
      if(t == typeof(int)) 
      { 
       _amount = value; 
      } 
      else 
      { 
       throw new ArgumentException("Amount must be an integer", "Amount"); 
      } 
     } 
    } 
} 

Visual Studio IDE说The type or namespace value could not be found。但我正在使用类型检查in this SO question。我正在使用类型,因此检查将在编译时发生。

+0

你尝试写的代码在这个例子中毫无意义:因为你声明的属性类型为'INT ','value'是* int *所必需的。由于'int'是一个'struct',它不能是某种不兼容的子类型或空值,它必须是一个可用的'int'。 –

回答

3

value是一个变量,所以typeof没有意义(如链接问题所示)。

您需要:

set { 
    Type t = value.GetType(); 
    if (t == typeof(int)) { 
    _amount = value; 
    } else { 
    throw new ArgumentException("Amount must be an integer", "Amount"); 
    } 
} 

注意,这将从未失败在编译时,作为二传是不实际运行,直到执行。我不确定你在这里试图阻止什么,如果你通过doublefloat,类型系统将执行正确的转换。整个检查应该是不必要的。

+0

我明白你的观点是多余的:)。我希望为类的用户提供更“特定的”错误信息,因为它很可能会尝试传递一个小数而不是整数。 – webworm

+0

好吧,'Decimal'也会演绎...... :)我假设你的意思是一个真正的(非整数)数字。就编译时间而言,你可能不走运。但我确实认为用户必须在某些情况下显式执行演员。 – BradleyDotNET

2

那么除了值必须是整数,因为该属性被声明为一个整数!

您需要对值使用.GetType()方法。 typeof是编译时操作。

所以

Type t = value.GetType(); 

但是,如果值是零,这将崩溃...