我有以下通用方法:
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;
}
I tried calling it like this:
string preference = preferencesService.GetUserPreference(key, programName);
But I get the following error:
The type arguments for method 'PreferencesService.GetUserPreference(string, string)' cannot be inferred from the usage. Try specifying the type arguments explicitly.
The Method it is being called from is as follows:
[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);
}
How do I call this generic method ?
uj5u.com熱心網友回復:
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);
uj5u.com熱心網友回復:
您可以通過像在定義中一樣添加泛型方法來顯式指定型別引數:
string preference = preferencesService.GetUserPreference<TheActualTypeYouKnowItIs>(key, programName);
C# 編譯器在這種情況下無法猜測它,基本上是因為它會為任何型別引數回傳字串。
uj5u.com熱心網友回復:
您必須定義 T 型別,因為該型別用于反序列化 JsonSerializer.Deserialize< T >(json)。如果由于某些原因你不知道型別,你可以使用物件作為型別,但基本上它只會被決議。你有一個錯誤回傳型別應該是 T,而不是字串
var preference = preferencesService.GetUserPreference<object>(key, programName);
或者如果你真的期待字串它應該是
var preference = preferencesService.GetUserPreference<string>(key, programName);
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/449172.html
