3

我试图扩展“对象”以允许更可读的检查对象是否为空。

现在,object.ReferenceEquals 真正检查一个空对象,(它不会应用的罕见情况是因为操作符==可以被覆盖。该object.Equals(null)方法也可以被覆盖)。

但是object.ReferenceEquals(null, obj);它不太可读是吗?...所以,我想,为什么不写一个扩展方法来System.object提供该检查使用object.IsNull(obj);

我试过了:

public static class MyExtClass
{
    // the "IsNull" extension to "object"  
    public static bool IsNull(this object obj)
    {
        return object.ReferenceEquals(obj, null);
    }
}

public SomeOtherClass
{
     public static void TryUsingTheExtension()
     {
          object obj;

          // Why does this line fail? the extension method is not recognized
          // I get: 'object' does not contain a definition for "IsNull"
          bool itIsANull = object.IsNull(obj);
     }
}

我错过了什么?

4

6 回答 6

3

扩展方法只能在实例上调用,而不能在它们扩展的类上调用。所以这行代码bool itIsANull = object.IsNull(obj);是不正确的,因为 object 是类型而不是实例。将其更改为:

bool itIsANull = (new object()).IsNull();

或者您可以在 MyExtClass 类上调用它,但不能在对象类(位于 mscore.lib 中)上调用它:

MyExtClass.IsNull(new object());

PS 看起来你错过了一些关于扩展方法的东西。事实上,它们与它们扩展的类无关。这只是 Intellisense 使用反射为我们提供的一种便利。

对象类位于 mscorelib 中并且是不可变的。你不能给它加点东西。但真正发生的是 Intellisense 搜索位于公共静态类中的所有公共方法,并接受带有关键字“this”作为参数的第一个参数。如果找到一个,它将“映射”到它扩展的类。因此,当我们在该类的实例上键入 obj.MyExtMethod() 时,编译器会自动将其转换为 Helper.MyExtMethod(obj); (如果 helper 是我们的静态类);

于 2015-07-24T07:07:21.720 回答
1

您编写了一个扩展方法,扩展方法存在于不同的类型中,但通过另一种方法扩展了指定类型的对象。

但是当您调用 时object.IsNull(),您正在寻找对象类型上存在的静态方法。

相反,您有两种方法来调用您的方法:

// either the static method on the class
MyExtClass.IsNull(obj);

// or using the actual feature of extension methods
obj.isNull();

因为是扩展方法,后一种形式会在编译时自动转换成前一种形式。

于 2015-07-24T07:03:17.113 回答
1

您正在对象本身上调用扩展方法。您应该改为在实例上调用方法 -

bool itIsANull = obj.IsNull()
于 2015-07-24T07:04:00.813 回答
1

尝试

bool itIsANull = obj.IsNull();
于 2015-07-24T07:05:09.373 回答
1

尝试:

    class Program
    {
        static void Main(string[] args)
        {
            var o = new object();
            if (o.IsNull())
            {
                Console.Write("null");
            }
        }
    }

    public static class Request
    {
        public static bool IsNull(this object obj)
        {
            return ReferenceEquals(obj, null);
        }
    }
于 2015-07-24T07:05:50.327 回答
1
public static class MyExtClass
    {
        // the "IsNull" extension to "object"  
        public static bool IsNull(this object obj)
        {
            return object.ReferenceEquals(obj, null);
        }

    }

    public class SomeOtherClass
    {
        public static void TryUsingTheExtension()
        {
            object obj =null;

            bool itIsANull = obj.IsNull();
        }

    }
于 2015-07-24T07:12:29.727 回答