创建一个空的通用对象

时间:2012-10-11 16:24:32

标签: c# generics reflection

  

可能重复:
  How do I compare a generic type to its default value?

我有一个泛型函数需要测试传入它的对象是否为空。但由于它是泛型类型,编译器不知道是否传递了类或结构。因此,我无法测试null,我必须测试类型是否为空。

    public virtual void SetFocusedObject(T obj)
{
    //since we dont know if T is a class or a struct test against default
    T defaultT = default(T);

    if(obj != defaultT)
    {
        //code      
    }
}

这不起作用,因为编译器不知道T能够编译测试

或者我也尝试了以下内容

    public virtual void SetFocusedObject(T obj)
{
    //since we dont know if T is a class or a struct test against empty type
    T defaultT = T.GetConstructor(T.EmptyTypes).Invoke(null);

    if(obj != defaultT)
    {
        //code  
    }
}

出于同样的原因,这也不起作用。我希望有人可能建议一种可行的方法。

2 个答案:

答案 0 :(得分:0)

这不是通用功能。除非函数是具有名为'T'的类型参数的泛型类的成员,否则您需要将其声明为:

public virtual void SetFocusedObject<T>(T obj)

这样您就可以成功使用default(T)

public virtual void SetFocusedObject<T>(T obj)
{   
    if (obj.Equals(default(T))) return;

    //code      
}

答案 1 :(得分:0)

如果由空引用对象表示null,并且当您将struct与null进行比较时得到false,为什么不将其用作测试:

    public static void Test<T>(T obj)
    {
        if (obj == null) // default refernce type (which is null)
        {
            Console.WriteLine("default!");
        }
        else if(obj.Equals(default(T))) // default value types
        {
            Console.WriteLine("default!");
        }
    }
    public static void Main()
    {
        object o = null;
        Test(o); // test detects default
        Test(0); // test detects default
        Class1 c = new Class1();
        Test(c); // test does not detect default
    }

虽然我不确定您是否考虑null引用类型的默认值,或者您是否想知道默认引用类型实例是否是默认构造函数创建的实例。