gpt4 book ai didi

c# - 根据泛型方法中的类型调用方法

转载 作者:行者123 更新时间:2023-11-30 22:07:53 24 4
gpt4 key购买 nike

获取字符串并将其解析为 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 无效

返回 (T?)b 不起作用

返回新的T?(b)

最佳答案

它当然不漂亮,但是两次转换为 object 然后转换为 T?(或者在本例中为三次转换,因为 b实际上是 bool 而不是 bool?) 会起作用:

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 方法:

public T? F<T>() where T : struct
{
var s = GetAString();
if (s == null)
return null;
var t = typeof(T);
if (parsers.ContainsKey(t))
return (T)parsers[t].Parse(s);
else
throw new Exception("Specified type is not supported");
}

关于c# - 根据泛型方法中的类型调用方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22648060/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com