小编Kir*_*ida的帖子

对于Func <T,TResult>,其中A扩展T,A不满足T

好吧,让我设置场景:我们在代码中使用了一个函数,它接受一个函数并对其进行一些日志记录然后返回结果.看起来有点像这样.

TResponse LoggedApiCall<TResponse>(Func<BaseRequest, BaseResponse> apiCall, ...)
    where TResponse : BaseResponse;
Run Code Online (Sandbox Code Playgroud)

在使用中我有以下四个对象

namespace Name.Space.Base {
    public class BaseRequest {
        ...
    }
}

namespace Name.Space.Base {
    public class BaseResponse {
        ...
    }
}

namespace Some.Other.Name.Space {
    public class Request : BaseRequest {
        ...
    }
}

namespace Name.Space {
    public class Response<TPayload> : BaseResponse {
        ...
    }
}
Run Code Online (Sandbox Code Playgroud)

所以,有了这些,我正在尝试模拟LoggedApiCall(使用Moq)以支持一些单元测试.我正在编写一个泛型方法,它允许我们传入一个满足基类型约束的函数和一个也匹配匹配的响应,以创建一个在Mock上执行.Setup()的公共方法.

它看起来像这样:

protected IReturnsResult<IService> SetupLoggedApiCall<TRequest, TResponse>(
    Func<TRequest, TResponse> function,
    TResponse response
    ) 
    where TRequest : BaseRequest 
    where TResponse : BaseResponse
{
    var baseFunction = function …
Run Code Online (Sandbox Code Playgroud)

c# generics mocking func

9
推荐指数
1
解决办法
617
查看次数

将对象转换为相同类型及其对性能的影响

关于将对象转换为相同类型的性能的问题(我知道这听起来很奇怪,但让我把它放在上下文中)

public T Get<T>(string key) where T : class
{
     var objToReturn = (T)_cache[key];
     if (objToReturn != null)
     {
         return objToReturn;
     }
     return null;
}
Run Code Online (Sandbox Code Playgroud)

上面是一段代码,用于尝试从调用者强类型化的类型T中获取该类型的对象。CacheObject

知道对象的类型是强类型的,我想知道这一行:

var objToReturn = (T)_chache[key];
Run Code Online (Sandbox Code Playgroud)

这实际上会调用强制转换并将缓存中的实例转换为另一个实例并返回该实例,还是会发现类型与强制转换相同而被忽略。

我问,因为转换的能力将在以后的应用程序开发中有用,该缓存用于获取派生类型,但我不想在早期产生潜在的重大性能影响。

思考并感谢你。

c# performance casting

3
推荐指数
1
解决办法
638
查看次数

标签 统计

c# ×2

casting ×1

func ×1

generics ×1

mocking ×1

performance ×1