我可以打电话Get<int>(Stat);
或Get<string>(Name);
但是在编译时,我得到:
无法将类型'int'隐式转换为'T'
同样的事情string
.
public T Get<T>(Stats type) where T : IConvertible
{
if (typeof(T) == typeof(int))
{
int t = Convert.ToInt16(PlayerStats[type]);
return t;
}
if (typeof(T) == typeof(string))
{
string t = PlayerStats[type].ToString();
return t;
}
}
Run Code Online (Sandbox Code Playgroud)
Bro*_*ass 125
您应该只能使用Convert.ChangeType()
而不是自定义代码:
public T Get<T>(Stats type) where T : IConvertible
{
return (T) Convert.ChangeType(PlayerStats[type], typeof(T));
}
Run Code Online (Sandbox Code Playgroud)
Eri*_*ert 122
每当你发现自己打开通用类型时,你几乎肯定会做错事.泛型应该是通用的 ; 它们应该完全独立于类型操作.
如果T只能是int或string,那么首先不要以这种方式编写代码.编写两个方法,一个返回一个int,另一个返回一个字符串.
Rez*_*eni 11
public T Get<T>(Stats type ) where T : IConvertible
{
if (typeof(T) == typeof(int))
{
int t = Convert.ToInt16(PlayerStats[type]);
return (T)t;
}
if (typeof(T) == typeof(string))
{
string t = PlayerStats[type].ToString();
return (T)t;
}
}
Run Code Online (Sandbox Code Playgroud)
小智 8
ChangeType
可能是你最好的选择.我的解决方案类似于BrokenGlass提供的一个try catch逻辑.
static void Main(string[] args)
{
object number = "1";
bool hasConverted;
var convertedValue = DoConvert<int>(number, out hasConverted);
Console.WriteLine(hasConverted);
Console.WriteLine(convertedValue);
}
public static TConvertType DoConvert<TConvertType>(object convertValue, out bool hasConverted)
{
hasConverted = false;
var converted = default(TConvertType);
try
{
converted = (TConvertType)
Convert.ChangeType(convertValue, typeof(TConvertType));
hasConverted = true;
}
catch (InvalidCastException)
{
}
catch (ArgumentNullException)
{
}
catch (FormatException)
{
}
catch (OverflowException)
{
}
return converted;
}
Run Code Online (Sandbox Code Playgroud)
考虑到 @BrokenGlass 逻辑 ( Convert.ChangeType
) 不支持 GUID 类型。
public T Get<T>(Stats type) where T : IConvertible
{
return (T) Convert.ChangeType(PlayerStats[type], typeof(T));
}
Run Code Online (Sandbox Code Playgroud)
错误:从“System.String”到“System.Guid”的无效转换。
相反,TypeDescriptor.GetConverter
通过添加System.ComponentModel
命名空间使用以下逻辑。
public T Get<T>(Stats type) where T : IConvertible
{
(T)TypeDescriptor.GetConverter(typeof(T)).ConvertFromInvariantString(PlayerStats[type])
}
Run Code Online (Sandbox Code Playgroud)
读这个。
小智 6
试试这个:
public T Get<T>(Stats type ) where T : IConvertible
{
if (typeof(T) == typeof(int))
{
return (T)(object)Convert.ToInt16(PlayerStats[type]);
}
if (typeof(T) == typeof(string))
{
return (T)(object)PlayerStats[type];
}
}
Run Code Online (Sandbox Code Playgroud)
实际上,您可以将其转换为object
,然后转换为T
。
T var = (T)(object)42;
的示例bool
:
public class Program
{
public static T Foo<T>()
{
if(typeof(T) == typeof(bool)) {
return (T)(object)true;
}
return default(T);
}
public static void Main()
{
bool boolValue = Foo<bool>(); // == true
string stringValue = Foo<string>(); // == null
}
}
Run Code Online (Sandbox Code Playgroud)
有时,这种行为是可取的。例如,当从基类或接口实现或重写泛型方法时,您要基于T
类型添加一些不同的功能。
归档时间: |
|
查看次数: |
76894 次 |
最近记录: |