我尝试扩展“object”以允许在对象为空时进行更易读的检查。
现在,object.ReferenceEquals
确实检查空对象,(由于操作符==
可以被覆盖,所以不会应用的极少数情况。{{1} }方法也可以被覆盖)。
但是object.Equals(null)
是不是太可读了?...所以,我想,为什么不写一个object.ReferenceEquals(null, obj);
的扩展方法来提供System.object
< / p>
我试过了:
object.IsNull(obj);
我错过了什么?
答案 0 :(得分:2)
尝试
virtual
答案 1 :(得分:2)
扩展方法只能在实例上调用,而不能在它们扩展的类上调用。所以这行代码bool itIsANull = object.IsNull(obj);
是不正确的,因为对象是类型而不是实例。将其更改为:
bool itIsANull = (new object()).IsNull();
或者您可以在类MyExtClass上调用它,但不能在对象类(位于mscore.lib中)上调用它:
MyExtClass.IsNull(new object());
P.S。 看起来你错过了一些关于扩展方法的东西。事实是,他们与他们扩展的类无关。这只是Intellisense使用反射为我们提供的便利。
对象类位于mscorelib中,并且是不可变的。你不能添加东西。但真正发生的是Intellisense搜索位于公共静态类中的所有公共方法,并接受带有关键字&#39;这个&#39;的第一个参数。作为参数。如果找到了一个,那就映射了#39;到它扩展的类。因此,当我们在该类的实例上键入obj.MyExtMethod()时,它会被编译器自动转换为Helper.MyExtMethod(obj); (如果帮助器是我们的静态类);
答案 2 :(得分:1)
您编写了扩展方法,扩展方法以不同的类型存在,但通过其他方法扩展指定类型的对象。
但是当你致电object.IsNull()
时,你正在寻找对象类型上存在的静态方法。
相反,您有两种方法可以调用您的方法:
// either the static method on the class
MyExtClass.IsNull(obj);
// or using the actual feature of extension methods
obj.isNull();
因为它是一个扩展方法,后一种形式将在编译时自动转换为前者。
答案 3 :(得分:1)
您正在调用对象本身的扩展方法。你应该在实例上调用methd -
bool itIsANull = obj.IsNull()
答案 4 :(得分: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);
}
}
答案 5 :(得分: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();
}
}