获取字符串并将其解析为T中给出的类型的通用函数。除了返回之外,我可以使它全部工作。我有一个bool,想把它变成T? T是bool。
public T? F<T>() where T : struct
{
var s= GetAString();
if(s==null) return null;
if(typeof(T) == typeof(bool))
{
var b = bool.Parse(s);
return ??
}
if(typeof(T) == typeof(int))
{
var i = int.Parse(s);
return ??
}
...
}
返回b不起作用
return(T?)b不起作用
返回新T?(b)
答案 0 :(得分:3)
它肯定不漂亮,但是再加注到object
然后转到T?
(或者在这种情况下为三重播放,因为b
实际上是{{1}而不是bool
)会起作用:
bool?
但是,我通常会避免编写这种代码。它首先打败了使用泛型的目的。毕竟,如果您必须为您可能接受的每个类型参数编写不同的策略,那么它不是泛型解决方案。
另一种解决方案是创建解析器&#39;这样的课程:
if(typeof(T) == typeof(bool))
{
var b = bool.Parse(s);
return (T?)(object)(bool?)b;
}
if(typeof(T) == typeof(int))
{
var i = int.Parse(s);
return (T?)(object)(int?)i;
}
将它们静态地注册在这样的字典中:
public interface IParser {
object Parse(string s);
}
public class BoolParser : IParser {
public object Parse(string s) {
return bool.Parse(s);
}
}
public class IntParser : IParser {
public object Parse(string s) {
return int.Parse(s);
}
}
现在你可以像这样编写private static Dictionary<Type, IParser> parsers = new Dictionary<Type, IParser>();
public static void Register<TResult, TParser>()
where TResult : struct
where TParser : IParser, new()
{
parsers.Add(typeof(TResult), new TParser());
}
...
Register<bool, BoolParser>();
Register<int, IntParser>();
方法:
F