3

我在我的应用程序中使用 .NET 映射库 AutoMapper,我有一个像这样的通用扩展方法:

public static T2 Map<T1, T2>(this T1 o)
{
    return Mapper.Map<T1, T2>(o);
}

...

var nc = new NonCustomer();
Customer c = nc.Map<NonCustomer, Customer>();

有什么办法可以摆脱T1扩展方法中的泛型参数以便推断出来?导致这样的调用:

var nc = new NonCustomer();
Customer c = nc.Map<Customer>();
4

5 回答 5

3

您不需要为 T1 参数使用通用版本。

您只需要将其更改为对象:

public static TDest Map<TDest>(this object o)
{
    // todo check o is not null
    return (TDest) Mapper.Map(o, o.GetType(), typeof (TDest));
}

如果您使用 AutoMapper v2 及更高版本,您可以编写如下:

public static TDest Map<TDest>(this object o)
{
    return Mapper.Map<TDest>(o);
}
于 2012-08-03T09:53:50.523 回答
3

不,没有办法。泛型类型推断不适用于返回类型。这种方式使您的扩展方法的有用性受到质疑。为什么不直接使用该.Map<TSource, TDest>方法?

于 2012-08-03T09:49:38.687 回答
1

好问题。我一直懒得自己回答,但是鞋匠的孩子总是最后得到扩展方法......

你可以让它更干一点,并且可以说是更漂亮的一步一步解决这个问题并一次做一个推断:

public static MapperSource<T> Mapper(this T that)
{
    return new MapperSource<T>( that);
}

public class MapperSource<T>
{
    public T2 To<T2>
    {
        return Mapper.Map<T,T2>();
    }
}

它允许您:

var nc = new NonCustomer();
Customer c = nc.Mapper().To<Customer>();

一种更常见的消费方式(无论如何对我来说)是为每个 'd 路线设置助手,Mapper.CreateMap如下所示:

public static Customer ToResult(this NonCustomer that)
{
    return that.Mapper().To<Customer>();
}

(可悲的是,因为没有扩展属性,所以没有比这更漂亮的了。再说一次,当我们都使用 F# 时,这一切都没有实际意义)

于 2012-08-03T10:49:47.133 回答
0

不,你不能,因为在 c# 中没有部分类型推断之类的东西。

于 2012-08-03T09:51:35.900 回答
0

仅当您完全删除T1泛型类型并为以下内容编写特定方法时NonCustomer

public static T2 Map<T2>(this NonCustomer o)
{
    return Mapper.Map<NonCustomer, T2>(o);
}
于 2012-08-03T10:00:08.423 回答