Вы бы определили это точно так, как вы уже сделали, но чтобы вызвать его, вы бы использовали стандартный статический вызов метода:
MyClass deserializedObject = GenericXmlSerialisationExtender.ReadFromXML<MyClass>(@"c:\filename.xml");
(Возможно, вы захотите дать вашему классу GenericXmlSerialisationExtender более подходящее имя, если вы сделаете это, или переместите его в другой статический класс)
Причина, по которой методы расширения не могут работать со статическими методами, заключается в том, что нет объекта, к которому также можно присоединить метод расширения.
В вашем примере:
public static T ReadFromXML<T>(string fileName)
Нигде в этой строке вы не определили тип, который вы хотели бы расширить. Методы расширения требуют, чтобы первым параметром был объект, с которым вы бы хотели, чтобы метод расширения действовал.
Методы расширения являются просто синтаксическим сахаром, как хороший способ создания статического вспомогательного метода.
в .net 2.0 вы бы написали:
public static class StringHelper
{
public static String AddFullStop(String data)
{
return data + ".";
}
}
String input = "test";
String output = StringHelper.AddFullStop(input);
.net 3.5 дает вам возможность сделать это:
public static class StringExtensions
{
public static String AddFullStop(this String data)
{
return data + ".";
}
}
String input = "test";
String output = input.AddFullStop();
Поэтому, если вы хотите сделать что-то за пределами полезных методов расширения, вы просто возвращаетесь к старому шаблону статического вспомогательного метода.