本文整理汇总了C#中System.Reflection.TypeInfo.IsSystemObject方法的典型用法代码示例。如果您正苦于以下问题:C# TypeInfo.IsSystemObject方法的具体用法?C# TypeInfo.IsSystemObject怎么用?C# TypeInfo.IsSystemObject使用的例子?那么恭喜您, 这里精选的方法代码示例或许可以为您提供帮助。您也可以进一步了解该方法所在类System.Reflection.TypeInfo
的用法示例。
在下文中一共展示了TypeInfo.IsSystemObject方法的1个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的C#代码示例。
示例1: AreTypesAssignableInternal
// Internally callable version of the export method above. Has two additional parameters:
// fBoxedSource : assume the source type is boxed so that value types and enums are
// compatible with Object, ValueType and Enum (if applicable)
// fAllowSizeEquivalence : allow identically sized integral types and enums to be considered
// equivalent (currently used only for array element types)
static bool AreTypesAssignableInternal(TypeInfo pSourceType, TypeInfo pTargetType, bool fBoxedSource, bool fAllowSizeEquivalence)
{
//
// Are the types identical?
//
if (AreTypesEquivalentInternal(pSourceType, pTargetType))
return true;
//
// Handle cast to interface cases.
//
if (pTargetType.IsInterface)
{
// Value types can only be cast to interfaces if they're boxed.
if (!fBoxedSource && pSourceType.IsValueType)
return false;
if (ImplementsInterface(pSourceType, pTargetType))
return true;
// Are the types compatible due to generic variance?
// if (pTargetType.HasGenericVariance && pSourceType.HasGenericVariance)
if (pTargetType.IsGenericType && pSourceType.IsGenericType)
return TypesAreCompatibleViaGenericVariance(pSourceType, pTargetType);
return false;
}
if (pSourceType.IsInterface)
{
// The only non-interface type an interface can be cast to is Object.
return pTargetType.IsSystemObject();
}
//
// Handle cast to array cases.
//
if (pTargetType.IsArray)
{
if (pSourceType.IsArray)
{
if (pSourceType.GetElementType().GetTypeInfo().IsPointer)
{
// If the element types are pointers, then only exact matches are correct.
// As we've already called AreTypesEquivalent at the start of this function,
// return false as the exact match case has already been handled.
// int** is not compatible with uint**, nor is int*[] oompatible with uint*[].
return false;
}
else
{
// Source type is also a pointer. Are the element types compatible? Note that using
// AreTypesAssignableInternal here handles array covariance as well as IFoo[] . Foo[]
// etc. Pass false for fBoxedSource since int[] is not assignable to object[].
return AreTypesAssignableInternal(pSourceType.GetElementType().GetTypeInfo(), pTargetType.GetElementType().GetTypeInfo(), false, true);
}
}
// Can't cast a non-array type to an array.
return false;
}
if (pSourceType.IsArray)
{
// Target type is not an array. But we can still cast arrays to Object or System.Array.
return pTargetType.IsSystemObject() || pTargetType.IsSystemArray();
}
//
// Handle pointer cases
//
if (pTargetType.IsPointer)
{
if (pSourceType.IsPointer)
{
if (pSourceType.GetElementType().GetTypeInfo().IsPointer)
{
// If the element types are pointers, then only exact matches are correct.
// As we've already called AreTypesEquivalent at the start of this function,
// return false as the exact match case has already been handled.
// int** is not compatible with uint**, nor is int*[] compatible with uint*[].
return false;
}
else
{
// Source type is also a pointer. Are the element types compatible? Note that using
// AreTypesAssignableInternal here handles array covariance as well as IFoo[] . Foo[]
// etc. Pass false for fBoxedSource since int[] is not assignable to object[].
return AreTypesAssignableInternal(pSourceType.GetElementType().GetTypeInfo(), pTargetType.GetElementType().GetTypeInfo(), false, true);
}
}
return false;
}
else if (pSourceType.IsPointer)
{
return false;
//.........这里部分代码省略.........