如何获得IEnumerable的基类型

Rao*_*ron 8 c# ienumerable

可能重复:
从IEnumerable <T>获取类型T.

我有一个属性类型 IEnumerable

public IEnumerable PossibleValues { get; set; }

如何发现它实例化的基本类型?

例如,如果它是这样创建的:

PossibleValues = new int?[] { 1, 2 }
Run Code Online (Sandbox Code Playgroud)

我想知道那个类型是'int'.

pho*_*oog 8

Type GetBaseTypeOfEnumerable(IEnumerable enumerable)
{
    if (enumerable == null)
    {
        //you'll have to decide what to do in this case
    }

    var genericEnumerableInterface = enumerable
        .GetType()
        .GetInterfaces()
        .FirstOrDefault(i => i.IsGenericType && i.GetGenericTypeDefinition() == typeof(IEnumerable<>));

    if (genericEnumerableInterface == null)
    {
        //If we're in this block, the type implements IEnumerable, but not IEnumerable<T>;
        //you'll have to decide what to do here.

        //Justin Harvey's (now deleted) answer suggested enumerating the 
        //enumerable and examining the type of its elements; this 
        //is a good idea, but keep in mind that you might have a
        //mixed collection.
    }

    var elementType = genericEnumerableInterface.GetGenericArguments()[0];
    return elementType.IsGenericType && elementType.GetGenericTypeDefinition() == typeof(Nullable<>)
        ? elementType.GetGenericArguments()[0]
        : elementType;
}
Run Code Online (Sandbox Code Playgroud)

此示例有一些限制,在您的应用程序中可能会或可能不会与您有关.它不处理类型实现IEnumerable但不实现的情况IEnumerable<T>.如果类型实现IEnumerable<T>多次,它会任意选择一个实现.


bug*_*d87 3

如果您想要 MaybeValues 的类型,您可以这样做:

var type = PossibleValues.GetType().ToString(); // "System.Nullable`1[System.Int32][]"
Run Code Online (Sandbox Code Playgroud)

或者,如果您想要 MaybeValues 中包含的项目的类型(假设数组实际上具有问题中描述的值),则可以执行此操作:

var type = PossibleValues.Cast<object>().First().GetType().ToString(); // "System.Int32"
Run Code Online (Sandbox Code Playgroud)



编辑

如果数组可能不包含任何项目,那么您当然必须进行一些空检查:

var firstItem = PossibleValues.Cast<object>().FirstOrDefault(o => o != null);
var type = string.Empty;
if (firstItem != null)
{
    type = firstItem.GetType().ToString();
}
Run Code Online (Sandbox Code Playgroud)