Code:
/ Net / Net / 3.5.50727.3053 / DEVDIV / depot / DevDiv / releases / Orcas / SP / ndp / fx / src / DataEntity / System / Data / Objects / ELinq / TypeSystem.cs / 2 / TypeSystem.cs
//----------------------------------------------------------------------
//
// Copyright (c) Microsoft Corporation. All rights reserved.
//
//
// @owner [....]
//---------------------------------------------------------------------
using System.Collections.Generic;
using System.Reflection;
using System.Data.Entity;
namespace System.Data.Objects.ELinq
{
///
/// Static utility class. Replica of query\DLinq\TypeSystem.cs
///
internal static class TypeSystem
{
private static readonly MethodInfo s_getDefaultMethod = typeof(TypeSystem).GetMethod(
"GetDefault", BindingFlags.Static | BindingFlags.NonPublic);
private static T GetDefault() { return default(T); }
internal static object GetDefaultValue(Type type)
{
// null is always the default for non value types and Nullable<>
if (!type.IsValueType ||
(type.IsGenericType &&
typeof(Nullable<>) == type.GetGenericTypeDefinition()))
{
return null;
}
MethodInfo getDefaultMethod = s_getDefaultMethod.MakeGenericMethod(type);
object defaultValue = getDefaultMethod.Invoke(null, new object[] { });
return defaultValue;
}
internal static bool IsSequenceType(Type seqType)
{
return FindIEnumerable(seqType) != null;
}
///
/// Resolves MemberInfo to a property or field.
///
/// Member to test.
/// Name of member.
/// Type of member.
/// Given member normalized as a property or field.
internal static MemberInfo PropertyOrField(MemberInfo member, out string name, out Type type)
{
name = null;
type = null;
if (member.MemberType == MemberTypes.Field)
{
FieldInfo field = (FieldInfo)member;
name = field.Name;
type = field.FieldType;
return field;
}
else if (member.MemberType == MemberTypes.Property)
{
PropertyInfo property = (PropertyInfo)member;
if (0 != property.GetIndexParameters().Length)
{
// don't support indexed properties
throw EntityUtil.NotSupported(System.Data.Entity.Strings.ELinq_PropertyIndexNotSupported);
}
name = property.Name;
type = property.PropertyType;
return property;
}
else if (member.MemberType == MemberTypes.Method)
{
// this may be a property accessor in disguise (if it's a RuntimeMethodHandle)
MethodInfo method = (MethodInfo)member;
if (method.IsSpecialName) // property accessor methods must set IsSpecialName
{
// try to find a property with the given getter
foreach (PropertyInfo property in method.DeclaringType.GetProperties(
BindingFlags.Static | BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic))
{
if (property.CanRead && (property.GetGetMethod(true) == method))
{
return PropertyOrField(property, out name, out type);
}
}
}
}
throw EntityUtil.NotSupported(System.Data.Entity.Strings.ELinq_NotPropertyOrField(member.Name));
}
private static Type FindIEnumerable(Type seqType)
{
// Ignores "terminal" primitive types in the EDM although they may implement IEnumerable<>
if (seqType == null || seqType == typeof(string) || seqType == typeof(byte[]))
return null;
if (seqType.IsArray)
return typeof(IEnumerable<>).MakeGenericType(seqType.GetElementType());
if (seqType.IsGenericType)
{
foreach (Type arg in seqType.GetGenericArguments())
{
Type ienum = typeof(IEnumerable<>).MakeGenericType(arg);
if (ienum.IsAssignableFrom(seqType))
{
return ienum;
}
}
}
Type[] ifaces = seqType.GetInterfaces();
if (ifaces != null && ifaces.Length > 0)
{
foreach (Type iface in ifaces)
{
Type ienum = FindIEnumerable(iface);
if (ienum != null) return ienum;
}
}
if (seqType.BaseType != null && seqType.BaseType != typeof(object))
{
return FindIEnumerable(seqType.BaseType);
}
return null;
}
internal static Type GetElementType(Type seqType)
{
Type ienum = FindIEnumerable(seqType);
if (ienum == null) return seqType;
return ienum.GetGenericArguments()[0];
}
internal static bool IsNullableType(Type type)
{
return type != null && type.IsGenericType && type.GetGenericTypeDefinition() == typeof(Nullable<>);
}
internal static Type GetNonNullableType(Type type)
{
if (IsNullableType(type))
{
return type.GetGenericArguments()[0];
}
return type;
}
}
}
// File provided for Reference Use Only by Microsoft Corporation (c) 2007.
//----------------------------------------------------------------------
//
// Copyright (c) Microsoft Corporation. All rights reserved.
//
//
// @owner [....]
//---------------------------------------------------------------------
using System.Collections.Generic;
using System.Reflection;
using System.Data.Entity;
namespace System.Data.Objects.ELinq
{
///
/// Static utility class. Replica of query\DLinq\TypeSystem.cs
///
internal static class TypeSystem
{
private static readonly MethodInfo s_getDefaultMethod = typeof(TypeSystem).GetMethod(
"GetDefault", BindingFlags.Static | BindingFlags.NonPublic);
private static T GetDefault() { return default(T); }
internal static object GetDefaultValue(Type type)
{
// null is always the default for non value types and Nullable<>
if (!type.IsValueType ||
(type.IsGenericType &&
typeof(Nullable<>) == type.GetGenericTypeDefinition()))
{
return null;
}
MethodInfo getDefaultMethod = s_getDefaultMethod.MakeGenericMethod(type);
object defaultValue = getDefaultMethod.Invoke(null, new object[] { });
return defaultValue;
}
internal static bool IsSequenceType(Type seqType)
{
return FindIEnumerable(seqType) != null;
}
///
/// Resolves MemberInfo to a property or field.
///
/// Member to test.
/// Name of member.
/// Type of member.
/// Given member normalized as a property or field.
internal static MemberInfo PropertyOrField(MemberInfo member, out string name, out Type type)
{
name = null;
type = null;
if (member.MemberType == MemberTypes.Field)
{
FieldInfo field = (FieldInfo)member;
name = field.Name;
type = field.FieldType;
return field;
}
else if (member.MemberType == MemberTypes.Property)
{
PropertyInfo property = (PropertyInfo)member;
if (0 != property.GetIndexParameters().Length)
{
// don't support indexed properties
throw EntityUtil.NotSupported(System.Data.Entity.Strings.ELinq_PropertyIndexNotSupported);
}
name = property.Name;
type = property.PropertyType;
return property;
}
else if (member.MemberType == MemberTypes.Method)
{
// this may be a property accessor in disguise (if it's a RuntimeMethodHandle)
MethodInfo method = (MethodInfo)member;
if (method.IsSpecialName) // property accessor methods must set IsSpecialName
{
// try to find a property with the given getter
foreach (PropertyInfo property in method.DeclaringType.GetProperties(
BindingFlags.Static | BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic))
{
if (property.CanRead && (property.GetGetMethod(true) == method))
{
return PropertyOrField(property, out name, out type);
}
}
}
}
throw EntityUtil.NotSupported(System.Data.Entity.Strings.ELinq_NotPropertyOrField(member.Name));
}
private static Type FindIEnumerable(Type seqType)
{
// Ignores "terminal" primitive types in the EDM although they may implement IEnumerable<>
if (seqType == null || seqType == typeof(string) || seqType == typeof(byte[]))
return null;
if (seqType.IsArray)
return typeof(IEnumerable<>).MakeGenericType(seqType.GetElementType());
if (seqType.IsGenericType)
{
foreach (Type arg in seqType.GetGenericArguments())
{
Type ienum = typeof(IEnumerable<>).MakeGenericType(arg);
if (ienum.IsAssignableFrom(seqType))
{
return ienum;
}
}
}
Type[] ifaces = seqType.GetInterfaces();
if (ifaces != null && ifaces.Length > 0)
{
foreach (Type iface in ifaces)
{
Type ienum = FindIEnumerable(iface);
if (ienum != null) return ienum;
}
}
if (seqType.BaseType != null && seqType.BaseType != typeof(object))
{
return FindIEnumerable(seqType.BaseType);
}
return null;
}
internal static Type GetElementType(Type seqType)
{
Type ienum = FindIEnumerable(seqType);
if (ienum == null) return seqType;
return ienum.GetGenericArguments()[0];
}
internal static bool IsNullableType(Type type)
{
return type != null && type.IsGenericType && type.GetGenericTypeDefinition() == typeof(Nullable<>);
}
internal static Type GetNonNullableType(Type type)
{
if (IsNullableType(type))
{
return type.GetGenericArguments()[0];
}
return type;
}
}
}
// File provided for Reference Use Only by Microsoft Corporation (c) 2007.
Link Menu

This book is available now!
Buy at Amazon US or
Buy at Amazon UK
- Int64KeyFrameCollection.cs
- NavigationProperty.cs
- OleDbCommand.cs
- TraceContextRecord.cs
- CollectionEditor.cs
- BoundColumn.cs
- AuthorizationRule.cs
- AssemblyName.cs
- ConfigXmlText.cs
- PageAsyncTask.cs
- HtmlTitle.cs
- XmlSiteMapProvider.cs
- Accessible.cs
- DataGridCell.cs
- Tablet.cs
- XmlILAnnotation.cs
- AddInIpcChannel.cs
- EditBehavior.cs
- NamespaceInfo.cs
- DataGridViewBindingCompleteEventArgs.cs
- DecimalAnimationUsingKeyFrames.cs
- BinaryMethodMessage.cs
- SvcMapFile.cs
- Menu.cs
- SqlDataReader.cs
- DefaultProxySection.cs
- SQLInt32.cs
- StaticFileHandler.cs
- DictionaryContent.cs
- CodeTypeDeclaration.cs
- GlyphTypeface.cs
- KeyNotFoundException.cs
- InvalidComObjectException.cs
- ConfigXmlWhitespace.cs
- BindingNavigatorDesigner.cs
- KeySpline.cs
- XmlSchemaGroup.cs
- ErrorWebPart.cs
- iisPickupDirectory.cs
- RecommendedAsConfigurableAttribute.cs
- GeneratedCodeAttribute.cs
- OverrideMode.cs
- MemoryStream.cs
- RepeaterCommandEventArgs.cs
- FillErrorEventArgs.cs
- HtmlTernaryTree.cs
- BCryptNative.cs
- MD5Cng.cs
- XmlLinkedNode.cs
- regiisutil.cs
- UpdateException.cs
- SimpleRecyclingCache.cs
- WindowShowOrOpenTracker.cs
- XmlDataCollection.cs
- TypeDependencyAttribute.cs
- SqlXml.cs
- IConvertible.cs
- DeploymentSectionCache.cs
- WizardStepBase.cs
- SettingsPropertyIsReadOnlyException.cs
- ObjectSet.cs
- OdbcStatementHandle.cs
- ContainerParaClient.cs
- EdmFunction.cs
- GifBitmapDecoder.cs
- ExpressionVisitor.cs
- _SSPISessionCache.cs
- WebControl.cs
- XmlChoiceIdentifierAttribute.cs
- CompositeControl.cs
- OracleDateTime.cs
- DoubleLink.cs
- CSharpCodeProvider.cs
- WebConvert.cs
- HMACSHA384.cs
- ResourceDictionaryCollection.cs
- BindingExpression.cs
- PriorityQueue.cs
- SeparatorAutomationPeer.cs
- followingsibling.cs
- XXXInfos.cs
- IgnoreDeviceFilterElementCollection.cs
- TimeZone.cs
- IPCCacheManager.cs
- DataGridClipboardCellContent.cs
- Setter.cs
- FloatUtil.cs
- DesignerAttributeInfo.cs
- LoginUtil.cs
- LogExtentCollection.cs
- WinHttpWebProxyFinder.cs
- EntityCollectionChangedParams.cs
- HttpStreamMessage.cs
- ITextView.cs
- EventWaitHandle.cs
- HtmlInputCheckBox.cs
- StorageRoot.cs
- ListControl.cs
- NextPreviousPagerField.cs
- DataGridRowEventArgs.cs