gpt4 book ai didi

c# - 没有装箱的通用解析方法

转载 作者:可可西里 更新时间:2023-11-01 07:59:59 26 4
gpt4 key购买 nike

我正在尝试编写一个通用的 Parse 方法来转换并返回来自 NamedValueCollection 的强类型值。我尝试了两种方法,但这两种方法都是通过装箱和拆箱来获取值的。有谁知道避免拳击的方法吗?如果您在生产中看到这个,您会不会喜欢它,它对性能有多糟糕?

用法:

var id = Request.QueryString.Parse<int>("id");

尝试 #1:

public static T Parse<T>(this NameValueCollection col, string key)
{
string value = col[key];

if (string.IsNullOrEmpty(value))
return default(T);

if (typeof(T) == typeof(int))
{
//return int.Parse(value); // cannot convert int to T
//return (T)int.Parse(value); // cannot convert int to T
return (T)(object)int.Parse(value); // works but boxes
}
if (typeof(T) == typeof(long))
{
return (T)(object)long.Parse(value); // works but boxes
}
...

return default(T);
}

尝试 #2(使用反射):

public static T Parse<T>(this NameValueCollection col, string key)
{
string value = col[key];

if (string.IsNullOrEmpty(value))
return default(T);

try
{
var parseMethod = typeof(T).GetMethod("Parse", new Type[] { typeof(string) });

if (parseMethod == null)
return default(T);

// still boxing because invoke returns an object
var parsedVal = parseMethod.Invoke(null, new object[] { value });
return (T)parsedVal;
}
// No Proper Parse Method found
catch(AmbiguousMatchException)
{
}

return default(T);
}

最佳答案

public static T Parse<T>(this NameValueCollection col, string key)
{
return (T)Convert.ChangeType(col[key], typeof(T));
}

我不完全确定是否有 ChangeType 框(我想阅读文档会告诉我,但我现在时间紧迫),但至少它摆脱了所有类型检查。不过,拳击开销不是很高,所以我不会太担心。如果您担心运行时类型的一致性,我会将函数编写为:

public static T Parse<T>(this NameValueCollection col, string key)
{
T value;

try
{
value = (T)Convert.ChangeType(col[key], typeof(T));
}
catch
{
value = default(T);
}

return value;
}

这样,如果由于任何原因无法转换值,函数就不会崩溃。当然,这意味着您必须检查返回值(无论如何您都必须这样做,因为用户可以编辑查询字符串)。

关于c# - 没有装箱的通用解析方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/390286/

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