2

我希望第二个调用风格应该类似于第一个调用风格。请参阅我的代码中的详细信息。非常感谢任何帮助。

这是我正在使用的代码。

// 第一种方法的调用方式

            var source = db.ThinkFeeds.Single(tf => tf.ID == 1);
            var target = new MyProduct.UIEntities.ThinkFeed();
            TypeConverter.ConvertBlToUi(source, target);

//调用第二种方法的样式。这真的是一种奇怪的调用方式。

        var source = MyProduct.UIEntities.Book.GetBookByID(1);
        var target = new MyProduct.DTOEntities.Book();
        TypeConverter.ConvertUiToDto<MyProduct.UIEntities.Book, MyProduct.DTOEntities.Book, Book>(source, target);

//第一种方法

    public static void ConvertBlToUi<TBl, TUi>(TBl entitySource, TUi entityTarget)
    {

    }

//第二种方法

    public static void ConvertUiToDto<TUi, TDto, TEntity>(TUi uiEntity, TDto dtoEntity)
        where TDto : DTOEntities.MyProductDTO<TEntity, TDto>
        where TEntity : EntityObject
    {

    }
4

3 回答 3

3

你不能。通用方法,类型推断:

编译器可以根据你传入的方法参数来推断类型参数;它不能仅从约束或返回值推断类型参数。所以 ...

您展示的第一种样式是使用类型推断,但这只是一种方便的速记。有时(如这里)类型推断无法工作,因此您必须显式提供类型参数。

于 2013-02-13T07:57:03.407 回答
0

in 中的TEntity类型参数ConvertUiToDto会阻止类型推断,并在调用此方法时强制您显式指定所有类型参数。不幸的是,此类型参数用于对 施加类型约束TDto

where TDto : DTOEntities.LightsailDTO<TEntity, TDto>

只要此约束仍然存在,您将无法TEntity从声明中删除并在调用时使用类型推断ConvertUiToDto

现在对我来说问题是:为什么LightsailDTO需要TEntity类型参数?DTO 不应该允许传输实体数据而不必公开它们吗?

于 2013-02-13T07:57:26.397 回答
0

我实际上问了一个类似的问题并自己提供了答案。

是否有 C# 无法使用类型约束推断泛型类型参数的解决方法?

基本上,您唯一的选择是传递 DTO 两次,让它分别推断每个泛型类型参数,如下所示:

public static void ConvertUiToDto<TUi, TDto, TEntity>(TUi uiEntity, TDto dtoEntity, DTOEntities.MyProductDTO<TEntity, TDto> dtoEntity2)
    where TDto : DTOEntities.MyProductDTO<TEntity, TDto>
    where TEntity : EntityObject
{

}

并这样称呼它:

var source = MyProduct.UIEntities.Book.GetBookByID(1);
var target = new MyProduct.DTOEntities.Book();
TypeConverter.ConvertUiToDto(source, target, target);
于 2013-02-13T19:21:11.487 回答