C# 列出默认返回
我有一个列表,它要么是空的,要么只有一个列表值 我希望能够根据调用函数将此列表转换为返回默认值,如下所示。有人能帮我弄清楚如何定义GetValue()吗C# 列出默认返回,c#,C#,我有一个列表,它要么是空的,要么只有一个列表值 我希望能够根据调用函数将此列表转换为返回默认值,如下所示。有人能帮我弄清楚如何定义GetValue()吗 var xx=新列表{1}; var yy=新列表{}; var zz=新列表{1}; Getvalue(xx)//返回1 Getvalue(xx)//返回1 Getvalue(xx)//返回1 Getvalue(xx)//返回1 Getvalue(yy)//返回0 Getvalue(yy)//返回0 Getvalue(yy)//返回空 Get
var xx=新列表{1};
var yy=新列表{};
var zz=新列表{1};
Getvalue(xx)//返回1
Getvalue(xx)//返回1
Getvalue(xx)//返回1
Getvalue(xx)//返回1
Getvalue(yy)//返回0
Getvalue(yy)//返回0
Getvalue(yy)//返回空
Getvalue(yy)//返回空
Getvalue(zz)//返回1
Getvalue(zz)//返回1
Getvalue(zz)//返回1
Getvalue(zz)//返回1
我有下面的函数,但它只适用于正常类型,如整数,长,但我需要的东西,而不是现在的工作列表
public T GetValue<T>(object value)
{
if (value == null || value == DBNull.Value)
{
return default(T);
}
else
{
//return (T)value;
return (T)Convert.ChangeType(value, typeof(T));
}
}
public T GetValue(对象值)
{
if(value==null | | value==DBNull.value)
{
返回默认值(T);
}
其他的
{
//返回(T)值;
return(T)Convert.ChangeType(value,typeof(T));
}
}
以下内容是否符合您的要求
public static T GetValue<T>(object value)
{
if (value == null || value == DBNull.Value)
{
return default(T);
}
else if (value.GetType().IsGenericType
&& value.GetType().GetGenericTypeDefinition().Equals(typeof(List<>)))
{
var list = ((System.Collections.IList)value).Cast<object>();
if (!list.Any())
return default(T);
return GetValue<T>(list.Single());
}
else
{
var type = typeof(T);
if (type.IsGenericType
&& type.GetGenericTypeDefinition().Equals(typeof(Nullable<>)))
{
if (value == null)
return default(T);
type = Nullable.GetUnderlyingType(type);
}
return (T)Convert.ChangeType(value, type);
}
}
可以编写一个GetValue
方法来完成任何列表的所有操作,但我建议不要这样做,因为它涉及一系列令人讨厌的运行时转换:
public T GetValue<T>(IEnumerable values) {
if (values == null) return default(T);
IEnumerator e = values.GetEnumerator();
if (!e.MoveNext()) return default(T);
if (typeof(T).IsGenericType && typeof(T).GetGenericTypeDefinition() == typeof(Nullable<>)) {
return (T) Convert.ChangeType(e.Current, Nullable.GetUnderlyingType(typeof(T)));
} else {
return (T) Convert.ChangeType(e.Current, typeof(T));
}
}
然后在外面进行转换,就像这样:
(int) xx.Unwrap()
这样做的好处是允许编译器检查您所做的是否合理。正如你的问题所暗示的那样,这确实假设你有强类型列表。如果列表最多只包含一个值,为什么要使用它?@derpirscher这是第三方API的返回格式,“使用通用方法‘GetValue(list)’需要两个类型参数”。@JeroenMostert Yes,and…?…这意味着你不能使用
GetValue(xx)
,这至少值得一提。@Jeroenmoster,哦,你说得对。我会修正答案的。
public T GetValue<T>(IEnumerable values) {
if (values == null) return default(T);
IEnumerator e = values.GetEnumerator();
if (!e.MoveNext()) return default(T);
if (typeof(T).IsGenericType && typeof(T).GetGenericTypeDefinition() == typeof(Nullable<>)) {
return (T) Convert.ChangeType(e.Current, Nullable.GetUnderlyingType(typeof(T)));
} else {
return (T) Convert.ChangeType(e.Current, typeof(T));
}
}
public static class ListExtensions {
public static T Unwrap<T>(this List<T> values) {
if (values == null || values.Count == 0) return default(T);
return values[0];
}
}
(int) xx.Unwrap()