如何确定可以为空的值类型

时间:2011-06-07 14:29:44

标签: c# .net

void Main()
{

   test((int?)null);

   test((bool?)null);

   test((DateTime?)null);

}

void test(object p)

{

   //**How to get the type of parameter p**
}

6 个答案:

答案 0 :(得分:8)

也许这会有所帮助:

void Main()
{

   test<int>(null);

   test<bool>(null);

   test<DateTime>(null);

}

void test<T>(Nullable<T> p)
where T : struct, new()
{
   var typeOfT = typeof(T);

}

答案 1 :(得分:5)

您无法获取该类型,因为您没有传递任何值。三次调用之间没有区别。

转换null值仅对编译器选择函数的特定重载有用。由于此处没有重载函数,因此在所有三种情况下都会调用相同的函数。在没有实际传入值的情况下,您的所有函数都将看到null值,它无法确定调用者将null值转换为的类型。

答案 2 :(得分:1)

.NET中的每个对象都有一个GetType()方法:

var type = p.GetType();

但是,如果您试图以这种方式找出参数的类型,通常表明您做错了。您可能希望查看重载方法或泛型。

修改

一位精明的评论者指出,null没有与之相关的类型。例如:

((int?)null) is int?

上述表达式将产生false。但是,使用泛型,您可以确定编译器期望对象具有的类型:

void Test<T>(T p)
{
    Type type = typeof(T);
    ...
}

同样,我认为这种策略通常是可以避免的,如果你能解释为什么需要它,我们可能会帮助你更多。

答案 3 :(得分:0)

你的意思是班级名字?这样就可以了:

  if(p != null)
  {
      p.GetType().FullName.ToString();
  }

或仅限于类型:

p.GetType();

答案 4 :(得分:0)

喜欢这个

If p IsNot nothing then
    GetType(p).GetGenericArguments()(0)
End If

(我假设您正在寻找泛型类型,因为获取对象本身的类型非常简单)

答案 5 :(得分:0)

除GetType外,您还可以使用is keyword,如下所示:

void test(object p) {
    if (p is int?) {
        // p is an int?
        int? i = p as int?;
    }
    else if (p is bool?) {
        // p is an bool?
        bool? b = p as bool?;
    }
}

如果p为null,则可以是int?bool?,或任何objectNullable类型。

一个优化是直接使用as keyword,如下所示:

void test(object p) {
    if (p == null)
        return; // Could be anything

    int? i = p as int?;
    if (i != null) {
        // p is an int?
        return;
    }

    bool? b = p as bool?;
    if (b != null) {
        // p is an bool?
        return;
    }
}