调用 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);
我有以下通用方法:
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);