泛型方法和泛型扩展方法、扩展方法有什么区别?

What is the difference between generic method and generic extension method and extension method?

通用方法通用扩展方法扩展方法有什么区别?

泛型方法的调用方式和普通方法一样,不同的是它可以通过指定泛型类型来用于不同的类型。

someObject.GenericMethodFromSameClass<String>();

通用扩展方法扩展方法在某种意义上彼此相似,它们可以在它们扩展的对象上调用。它们之间的区别与常规方法和泛型方法之间的区别相同。

someObject.ExtensionMethodFromOtherClass();
someObject.GenericExtensionMethodFromOtherClass<String>();

• 扩展方法: 使用扩展方法可以向指定的 type 添加一些额外的方法。 对于创建扩展方法

  1. Definition class with public static attribute.
  2. Definition method in class with public static attribute.
  3. For first parameter of method defined extension method .place before this parameter keyword this.
public static class TestExtensionClass
{
    public static string TestExtinsionMethod(this string password)
    {
        string encriptedPassword="";
        byte[] ASCIIValues = Encoding.ASCII.GetBytes(password);
        foreach (byte b in ASCIIValues)
        {
            encriptedPassword += b.ToString();
        }
        return encriptedPassword;
    }
}
  1. In other classes call extension method.
       private void CallExtensionMethod()
    {
        string s = "123";
        s.TestExtinsionMethod();
    }

• 通用方法: 使用通用方法,您可以在运行时定义输出类型。 对于创建扩展方法

  1. Definition class.

  2. Definition method. Before name of method place T.

  3. After name of method place <**T>**.
     public T TestCastTo<T>(object obj)
    {
        return (T)obj;
    }
  1. In other classes call Generic method.
     public static T TestCastTo<T>(this object obj)
    {
        return (T)obj;
    }

• 通用扩展方法: • 通过组合属性扩展方法和通用方法,您可以获得通用扩展方法。

     public static T TestCastTo<T>(this object obj)
    {
        return (T)obj;
    }

在其他 class 中调用通用扩展方法

    private void CallGenericExtensionMethod()
    {
        string s = "123";
        int i = s.TestCastTo<int>();
    }

Generic method 来自 MSDN。

A generic method is a method that is declared with type parameters

static void Swap<T>(ref T lhs, ref T rhs)
{
    T temp;
    temp = lhs;
    lhs = rhs;
    rhs = temp;
}

此方法交换 lhs(左侧)和 rhs(右侧)之间的引用。因为我们只想交换引用,并不关心引用的底层类型是什么,所以我们可以将方法声明为泛型方法,类型参数为T。这意味着它可以是任何类型。这使我们不必编写多个 Swap 方法。

string s1 = "hello";
string s2 = "world";
Swap(ref s1, ref s2);

int i1 = 5;
int i2 = 12;
Swap(ref i1, ref i2);

虽然可以使用对象类型作为 Swap 方法参数来编写示例,但这会导致不必要的值类型开销,称为装箱。


Extension method 来自 MSDN

Extension methods enable you to "add" methods to existing types without creating a new derived type, recompiling, or otherwise modifying the original type.

假设我们想要扩展现有的字符串 class 以包含一种计算字符串中单词的方法。

public static int WordCount(this String str)
{
    return str.Split(new char[] { ' ', '.', '?' }, 
                     StringSplitOptions.RemoveEmptyEntries).Length;
}

现在我们可以计算任何字符串对象中的单词。

string s = "Hello Extension Methods";
int i = s.WordCount();

这对于向现有 classes 添加您无权访问 的功能(方法)特别有用(例如,来自第三方程序集)。


通用扩展方法只是前两个概念的混合。

方法可以是通用非通用,例如:

public void Foo() { }   // Non-Generic Method

public void Foo<T>(T value) { } // Generic Method

扩展方法 是用于扩展类型行为而不修改类型本身的方法。假设您希望 String 类型有一个 Reverse 方法,您可以在 String 类型上定义一个扩展方法,如下所示:

public static class ExtMethods
{
    public static string Reverse(this string s) // Non-Generic Extension Method
    {
        // code to reverse string
    }
} 

扩展方法必须声明为 static 并且在 static class 中,而且它的第一个参数必须有 this 在它扩展的类型之前。

同样,扩展方法可以是通用的:

public static class ExtMethods
{
    public static Foo<T>(this T obj)  // Generic extension method
    {

    }
}

因此,通用扩展方法只是一个恰好是通用的扩展方法