调用 T 方法并将结果转换为字符串 C#

Calling a T Method and converting results to string C#

我有以下通用方法:

        public T GetUserPreference<T>(string keyName, string programName)
        {
            string json = preferencesRepository.GetUserPreference(keyName, programName);
            if (json != null)
            {
                try
                {
                    return JsonSerializer.Deserialize<T>(json);
                }
                catch (Exception ex)
                {
                    Logger.LogError(ex, nameof(GetUserPreference));
                }
            }
            return default(T);
        }

这是我的 GetUserPreference 方法的代码:

        public string GetUserPreference(string key, string programName)
        {
            string query = { Retrieving data from a varbinary field in SQL }
            List<SqlParameter> sqlParams = new List<SqlParameter>
            {
                new SqlParameter("@Username", SqlDbType.VarChar) { Value = GlobalUserName },
                new SqlParameter("@ProgramName", SqlDbType.VarChar) { Value = programName },
                new SqlParameter("@KeyName", SqlDbType.VarChar) { Value = key }
            };
            try
            {
                object preferenceResult = Data.ExecuteScalar(query, SqlServerConnectionString, sqlParams.ToArray());
                return preferenceResult == null ? null : Encoding.UTF8.GetString((byte[])preferenceResult);
            }
            catch (Exception ex)
            {
                logger.LogError(ex, "");
            }
            return null;
        }

我试着这样称呼它: string preference = preferencesService.GetUserPreference(key, programName);

但我收到以下错误:

The type arguments for method 'PreferencesService.GetUserPreference(string, string)' cannot be inferred from the usage. Try specifying the type arguments explicitly.

调用它的方法如下:

        [ApiVersion("1.0")]
        [HttpGet("v{version:apiVersion}/Preferences", Name = "Get User Preference")]
        public IActionResult Get(string key, string programName)
        {
            string preference = preferencesService.GetUserPreference<T>(key, programName);
            if (preference == null)
            {
                return new NoContentResult();
            }
            return Content(preference);
        }

如何调用这个泛型方法?

您可以通过在定义中添加它来显式指定泛型方法的类型参数:

string preference = preferencesService.GetUserPreference<TheActualTypeYouKnowItIs>(key, programName);

C# 编译器无法在此上下文中猜测它,主要是因为它会 return 任何类型参数的字符串。

您必须定义 T 类型,因为此类型用于反序列化 JsonSerializer.Deserialize< T >(json)。如果由于某些原因你不知道类型,你可以使用对象作为类型,但基本上它只会被解析。而且你有一个错误 return type 应该是 T,而不是 string

var preference  = preferencesService.GetUserPreference<object>(key, programName);

或者如果你真的想要字符串,它应该是

var preference  = preferencesService.GetUserPreference<string>(key, programName);

如果您处于通用上下文(通用方法或 class),则只能使用 T(或任何类型的填充符)。

比如你的第一个方法

public T GetUserPreference<T>(string keyName, string programName)

但是,在 non-generic 调用方中,您必须指定要用来调用泛型方法的类型。所以

string preference = preferencesService.GetUserPreference<T>(key, programName); 
//Wrong in non generic context

这里你应该使用and实际类型而不是T。

现在,根据您对 GetUserPreference<T> 的实施,T 用于确定要用于反序列化的类型。所以你应该使用你期望结果的类型。

示例,

string preference = preferencesService.GetUserPreference<string>(key, programName);