gpt4 book ai didi

c# - 避免在泛型方法中进行过多的类型检查?

转载 作者:太空狗 更新时间:2023-10-29 19:58:24 28 4
gpt4 key购买 nike

我的问题涉及泛型方法链中的类型检查。假设我有一个扩展方法尝试将字节数组转换为 int、decimal、string 或 DateTime。

public static T Read<T>(this ByteContainer ba, int size, string format) where T : struct, IConvertible
{
var s = string.Concat(ba.Bytes.Select(b => b.ToString(format)).ToArray());
var magic = FromString<T>(s);
return (T)Convert.ChangeType(magic, typeof(T));
}

这会调用一个名为 FromString 的方法,该方法将连接的字符串转换为特定类型。不幸的是,业务逻辑完全依赖于类型 T。所以我最终得到了一个巨大的 if-else block :

private static T FromString<T>(string s) where T : struct
{
if (typeof(T).Equals(typeof(decimal)))
{
var x = (decimal)System.Convert.ToInt32(s) / 100;
return (T)Convert.ChangeType(x, typeof(T));
}
if (typeof(T).Equals(typeof(int)))
{
var x = System.Convert.ToInt32(s);
return (T)Convert.ChangeType(x, typeof(T));
}
if (typeof(T).Equals(typeof(DateTime)))
... etc ...
}

在这一点上,我更喜欢具有相同名称和不同返回类型的多个方法,大致如下:

// <WishfulThinking>
private static decimal FromString<T>(string s)
{
return (decimal)System.Convert.ToInt32(s) / 100;
}
private static int FromString<T>(string s)
{
return System.Convert.ToInt32(s);
}
// </WishfulThinking>

...但我意识到这是无效的,因为 T 不能被限制为特定类型,如果没有它,所有方法都将具有相同的冲突签名。

有没有一种可行的方法可以在不进行过多类型检查的情况下实现 FromString?或者是否有更好的方法来解决这个问题?

最佳答案

Or might there be a better way to approach this problem altogether?

当然,有一个:你可以把每个转换器做成一个 lambda,把它们做成一个字典,然后用它们进行转换,就像这样:

private static IDictionary<Type,Func<string,object>> Converters = new Dictionary<Type,Func<string,object>> {
{typeof(int), s => Convert.ChangeType(System.Convert.ToInt32(s), typeof(int))}
, {typeof(decimal), s => Convert.ChangeType((decimal)System.Convert.ToInt32(s) / 100, typeof(decimal))}
, ... // And so on
};
public static T Read<T>(this ByteContainer ba, int size, string format) where T : struct, IConvertible {
Func<string,object> converter;
if (!Converters.TryGetValue(typeof(T), out converter)) {
throw new ArgumentException("Unsupported type: "+typeof(T));
}
var s = string.Concat(ba.Bytes.Select(b => b.ToString(format)).ToArray());
return (T)converter(s);
}

关于c# - 避免在泛型方法中进行过多的类型检查?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18154929/

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