调用一个T方法并将结果转换为字符串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);

但我得到以下错误:

无法根据用法推断方法"PreferencesService.GetUserPreference(string,string("的类型参数。请尝试显式指定类型参数。

调用它的方法如下:

[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);
}

如何调用此泛型方法?

只有在Generic上下文(Generic方法或类(中,才能使用T(或任何类型填充符(。

例如,您的第一种方法

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

但是,在非泛型调用程序中,必须指定要调用泛型方法的类型。所以

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

在这里你应该使用和实际类型,而不是T.

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

示例,

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

您可以显式指定泛型方法的类型参数,方法是将其添加到定义中:

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

C#编译器在这种情况下无法猜测,基本上是因为它会为任何类型的参数返回字符串。

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

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

或者,如果你真的期望字符串,它应该是

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

最新更新