如何将类型化的值转换为通用类型T?

时间:2019-01-07 12:40:47

标签: c# generics

我正在尝试在.NET Core应用程序中使用Azure Redis缓存。我写了一个CacheHelper通用方法,该方法实现了如下所示的通用接口。

但是,此问题与泛型更相关。

在将缓存值转换为通用类型时遇到错误。这是正确的方法吗?还是我错过了什么?请参见下面的代码。

appengineDeployTesting

3 个答案:

答案 0 :(得分:3)

您可以在这里利用内置的pipeline { agent any environment { buildResult = 'null' } stages{ stage('Build Using Maven') { steps{ echo env.buildResult script { env.buildResult = "FALIURE" } echo env.buildResult notifyBuild('STARTED') withMaven(maven : 'maven'){ sh ''' mvn clean install -DskipTests cd project_pom/pom_espo_bdd_tests mvn test ''' } 类来发挥自己的优势:

Convert

答案 1 :(得分:0)

我想再分享一个将 RedisValue 转换为 'T' 类型的实现。 RedisValue 实现了 IConvertible 接口,该接口具有将实例值转换为公共语言运行时类型的方法。这可能对某人有帮助。

private RedisValue GetStringInRedis(string key)
{
    var redisDb = RedisConnection.GetDatabase();

    var redisValue = redisDb.StringGet(redisKey);
    if (redisValue.HasValue)
    {
        return redisValue;
    }

    return RedisValue.Null;
 }

private T ChangeToType<T>(string key, RedisValue redisValue)
{
    if (redisValue.IsNull)
        return default(T);

    try
    {
        var sRedisValue = redisValue;
        if (typeof(T) == typeof(bool))
        {
            var tempRedisValue = (string) redisValue;
            if (tempRedisValue.ToLower() == "true")
                sRedisValue = RedisValue.Unbox(1);
            else
                sRedisValue = RedisValue.Unbox(0);
        }

        var obj = Convert.ChangeType(sRedisValue, typeof(T));
        return (T) obj;
    }
    catch
    {
        throw new Exception($"Redis key '{key}' has invalid redis value '{redisValue}'");
    }
}

public T GetValue<T>(string key)
{
    var redisValue = GetStringInRedis(key);
    return ChangeToType<T>(key, redisValue);
}

答案 2 :(得分:-1)

在我看来,如果使用ICacheHelper<T>接口,则应该创建两个不同的实现。 一种用于实现string的{​​{1}}类型。 所有其他实现ICacheHelper<string>的类型之一。