C# 列出默认返回

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

我有一个列表,它要么是空的,要么只有一个列表值

我希望能够根据调用函数将此列表转换为返回默认值,如下所示。有人能帮我弄清楚如何定义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)//返回空
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()