可能重复:
从IEnumerable <T>获取类型T.
我有一个属性类型 IEnumerable
public IEnumerable PossibleValues { get; set; }
如何发现它实例化的基本类型?
例如,如果它是这样创建的:
PossibleValues = new int?[] { 1, 2 }
Run Code Online (Sandbox Code Playgroud)
我想知道那个类型是'int'.
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>多次,它会任意选择一个实现.
如果您想要 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)
| 归档时间: |
|
| 查看次数: |
7013 次 |
| 最近记录: |