C#对象的扩展方法

Man*_*ake 32 c# extension-methods

在Object类上使用扩展方法是个好主意吗?

我想知道是否通过注册此方法,如果您因为将加载到上下文中加载的每个对象而导致性能损失.

And*_*zub 34

除了另一个答案:

因为扩展方法是编译器功能,所以不会有性能损失.考虑以下代码:

public static class MyExtensions
{
    public static void MyMethod(this object) { ... }
} 

object obj = new object();
obj.MyMethod();
Run Code Online (Sandbox Code Playgroud)

调用MyMethod将实际编译为:

MyExtensions.MyMethod(obj);
Run Code Online (Sandbox Code Playgroud)


Dar*_*opp 12

没有性能损失,因为它没有附加到系统中的每个类型,它只能在系统中的任何类型上调用.所有将要发生的是该方法将显示在intellisense中的每个对象上.

问题是:你真的需要它在对象上,还是更具体.如果需要在对象上,则将其设为对象.

  • 值得注意的是,如果你在命名空间中包含了一个using语句,你的扩展方法已被声明,那么它只会显示在"intellisense中的每个对象"中. (7认同)

Mar*_*ius 7

如果您确实打算扩展每个对象,那么这样做是正确的。但是,如果您的扩展实际上仅适用于对象的子集,则应将其应用于必要的最高层次结构级别,但仅此而已。

此外,该方法仅在导入命名空间的情况下可用。

我已经扩展Object了一个尝试转换为指定类型的方法:

public static T TryCast<T>(this object input)
{
    bool success;
    return TryCast<T>(input, out success);
}
Run Code Online (Sandbox Code Playgroud)

我还重载了它以接受successbool (就像TryParse那样):

public static T TryCast<T>(this object input, out bool success)
{
    success = true;
    if(input is T)
        return (T)input;
    success = false;
    return default(T);
}
Run Code Online (Sandbox Code Playgroud)

此后,我将其扩展为也尝试解析input(通过使用ToString和使用转换器),但这变得更加复杂。