一般编写扩展名的正确方法是什么?

Kei*_*ows 2 c# generics extension-methods

我已经看到了以几种不同的方式为泛型编写类扩展的示例.我将使用AutoMapper作为示例.

1)

public static class Extensions<Src, Tgt>
{
    public static Tgt TransferData(this Src source)
    {
        AutoMapper.Mapper.CreateMap<Src, Tgt>();
        return AutoMapper.Mapper.Map<Src, Tgt>(source);
    }
}
Run Code Online (Sandbox Code Playgroud)

2)

public static class Extensions2
{
    public static Tgt TransferData<Src, Tgt>(this Src source)
    {
        AutoMapper.Mapper.CreateMap<Src, Tgt>();
        return AutoMapper.Mapper.Map<Src, Tgt>(source);
    }
}
Run Code Online (Sandbox Code Playgroud)

哪个更好?为什么?第一个甚至是正确的吗?

Jon*_*eet 7

不,第一个不正确.扩展方法必须在顶级静态非泛型类中定义.

另外,我建议遵守类型参数的命名约定:

public static class Extensions2
{
    public static TTarget TransferData<TSource, TTarget>(this TSource source)
    {
        AutoMapper.Mapper.CreateMap<TSource, TTarget>();
        return AutoMapper.Mapper.Map<TSource, TTarget>(source);
    }
}
Run Code Online (Sandbox Code Playgroud)