Code:
/ Dotnetfx_Vista_SP2 / Dotnetfx_Vista_SP2 / 8.0.50727.4016 / DEVDIV / depot / DevDiv / releases / Orcas / QFE / ndp / fx / src / DataWeb / Client / System / Data / Services / Client / ALinq / TypeSystem.cs / 1 / TypeSystem.cs
//----------------------------------------------------------------------
//
// Copyright (c) Microsoft Corporation. All rights reserved.
//
//
// Utility functions for processing Expression trees
//
//
// @owner [....]
//---------------------------------------------------------------------
namespace System.Data.Services.Client
{
using System;
using System.Collections.Generic;
using System.Collections;
using System.Text;
using System.Reflection;
using System.Diagnostics;
using System.Linq;
/// Utility functions for processing Expression trees
internal static class TypeSystem
{
/// Method map for methods in URI query options
private static readonly Dictionary expressionMethodMap;
/// VB Method map for methods in URI query options
private static readonly Dictionary expressionVBMethodMap;
/// Properties that should be represented as methods
private static readonly Dictionary propertiesAsMethodsMap;
/// VB Assembly name
#if !ASTORIA_LIGHT
private const string VisualBasicAssemblyFullName = "Microsoft.VisualBasic, Version=8.0.0.0, Culture=neutral, PublicKeyToken=" + AssemblyRef.MicrosoftPublicKeyToken;
#else
private const string VisualBasicAssemblyFullName = "Microsoft.VisualBasic, Version=2.0.5.0, Culture=neutral, PublicKeyToken=" + AssemblyRef.MicrosoftSilverlightPublicKeyToken;
#endif
///
/// Initializes method map
///
[System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Performance", "CA1810:InitializeReferenceTypeStaticFieldsInline", Justification = "Cleaner code")]
static TypeSystem()
{
// string functions
#if !ASTORIA_LIGHT
const int ExpectedCount = 24;
#else
const int ExpectedCount = 22;
#endif
expressionMethodMap = new Dictionary(ExpectedCount);
expressionMethodMap.Add(typeof(string).GetMethod("Contains", new Type[] { typeof(string) }), @"substringof");
expressionMethodMap.Add(typeof(string).GetMethod("EndsWith", new Type[] { typeof(string) }), @"endswith");
expressionMethodMap.Add(typeof(string).GetMethod("StartsWith", new Type[] { typeof(string) }), @"startswith");
expressionMethodMap.Add(typeof(string).GetMethod("IndexOf", new Type[] { typeof(string) }), @"indexof");
expressionMethodMap.Add(typeof(string).GetMethod("Replace", new Type[] { typeof(string), typeof(string) }), @"replace");
expressionMethodMap.Add(typeof(string).GetMethod("Substring", new Type[] { typeof(int) }), @"substring");
expressionMethodMap.Add(typeof(string).GetMethod("Substring", new Type[] { typeof(int), typeof(int) }), @"substring");
expressionMethodMap.Add(typeof(string).GetMethod("ToLower", Type.EmptyTypes), @"tolower");
expressionMethodMap.Add(typeof(string).GetMethod("ToUpper", Type.EmptyTypes), @"toupper");
expressionMethodMap.Add(typeof(string).GetMethod("Trim", Type.EmptyTypes), @"trim");
expressionMethodMap.Add(typeof(string).GetMethod("Concat", new Type[] { typeof(string), typeof(string) }, null), @"concat");
expressionMethodMap.Add(typeof(string).GetProperty("Length", typeof(int)).GetGetMethod(), @"length");
// datetime methods
expressionMethodMap.Add(typeof(DateTime).GetProperty("Day", typeof(int)).GetGetMethod(), @"day");
expressionMethodMap.Add(typeof(DateTime).GetProperty("Hour", typeof(int)).GetGetMethod(), @"hour");
expressionMethodMap.Add(typeof(DateTime).GetProperty("Month", typeof(int)).GetGetMethod(), @"month");
expressionMethodMap.Add(typeof(DateTime).GetProperty("Minute", typeof(int)).GetGetMethod(), @"minute");
expressionMethodMap.Add(typeof(DateTime).GetProperty("Second", typeof(int)).GetGetMethod(), @"second");
expressionMethodMap.Add(typeof(DateTime).GetProperty("Year", typeof(int)).GetGetMethod(), @"year");
// math methods
expressionMethodMap.Add(typeof(Math).GetMethod("Round", new Type[] { typeof(double) }), @"round");
expressionMethodMap.Add(typeof(Math).GetMethod("Round", new Type[] { typeof(decimal) }), @"round");
expressionMethodMap.Add(typeof(Math).GetMethod("Floor", new Type[] { typeof(double) }), @"floor");
#if !ASTORIA_LIGHT // Math.Floor(Decimal) not available
expressionMethodMap.Add(typeof(Math).GetMethod("Floor", new Type[] { typeof(decimal) }), @"floor");
#endif
expressionMethodMap.Add(typeof(Math).GetMethod("Ceiling", new Type[] { typeof(double) }), @"ceiling");
#if !ASTORIA_LIGHT // Math.Ceiling(Decimal) not available
expressionMethodMap.Add(typeof(Math).GetMethod("Ceiling", new Type[] { typeof(decimal) }), @"ceiling");
#endif
Debug.Assert(expressionMethodMap.Count == ExpectedCount, "expressionMethodMap.Count == ExpectedCount");
// vb methods
// lookup these by type name + method name
expressionVBMethodMap = new Dictionary();
expressionVBMethodMap.Add("Microsoft.VisualBasic.Strings.Trim", @"trim");
expressionVBMethodMap.Add("Microsoft.VisualBasic.Strings.Len", @"length");
expressionVBMethodMap.Add("Microsoft.VisualBasic.Strings.Mid", @"substring");
expressionVBMethodMap.Add("Microsoft.VisualBasic.Strings.UCase", @"toupper");
expressionVBMethodMap.Add("Microsoft.VisualBasic.Strings.LCase", @"tolower");
expressionVBMethodMap.Add("Microsoft.VisualBasic.DateAndTime.Year", @"year");
expressionVBMethodMap.Add("Microsoft.VisualBasic.DateAndTime.Month", @"month");
expressionVBMethodMap.Add("Microsoft.VisualBasic.DateAndTime.Day", @"day");
expressionVBMethodMap.Add("Microsoft.VisualBasic.DateAndTime.Hour", @"hour");
expressionVBMethodMap.Add("Microsoft.VisualBasic.DateAndTime.Minute", @"minute");
expressionVBMethodMap.Add("Microsoft.VisualBasic.DateAndTime.Second", @"second");
Debug.Assert(expressionVBMethodMap.Count == 11, "expressionVBMethodMap.Count == 11");
propertiesAsMethodsMap = new Dictionary();
propertiesAsMethodsMap.Add(
typeof(string).GetProperty("Length", typeof(int)),
typeof(string).GetProperty("Length", typeof(int)).GetGetMethod());
propertiesAsMethodsMap.Add(
typeof(DateTime).GetProperty("Day", typeof(int)),
typeof(DateTime).GetProperty("Day", typeof(int)).GetGetMethod());
propertiesAsMethodsMap.Add(
typeof(DateTime).GetProperty("Hour", typeof(int)),
typeof(DateTime).GetProperty("Hour", typeof(int)).GetGetMethod());
propertiesAsMethodsMap.Add(
typeof(DateTime).GetProperty("Minute", typeof(int)),
typeof(DateTime).GetProperty("Minute", typeof(int)).GetGetMethod());
propertiesAsMethodsMap.Add(
typeof(DateTime).GetProperty("Second", typeof(int)),
typeof(DateTime).GetProperty("Second", typeof(int)).GetGetMethod());
propertiesAsMethodsMap.Add(
typeof(DateTime).GetProperty("Month", typeof(int)),
typeof(DateTime).GetProperty("Month", typeof(int)).GetGetMethod());
propertiesAsMethodsMap.Add(
typeof(DateTime).GetProperty("Year", typeof(int)),
typeof(DateTime).GetProperty("Year", typeof(int)).GetGetMethod());
Debug.Assert(propertiesAsMethodsMap.Count == 7, "propertiesAsMethodsMap.Count == 7");
}
///
/// Sees if method has URI equivalent
///
/// The method info
/// uri method name
/// true/ false
internal static bool TryGetQueryOptionMethod(MethodInfo mi, out string methodName)
{
return (expressionMethodMap.TryGetValue(mi, out methodName) ||
(mi.DeclaringType.Assembly.FullName == VisualBasicAssemblyFullName &&
expressionVBMethodMap.TryGetValue(mi.DeclaringType.FullName + "." + mi.Name, out methodName)));
}
///
/// Sees if property can be represented as method for translation to URI
///
/// The property info
/// get method for property
/// true/ false
internal static bool TryGetPropertyAsMethod(PropertyInfo pi, out MethodInfo mi)
{
return propertiesAsMethodsMap.TryGetValue(pi, out mi);
}
///
/// Gets the elementtype for a sequence
///
/// The sequence type
/// The element type
internal static Type GetElementType(Type seqType)
{
Type ienum = FindIEnumerable(seqType);
if (ienum == null)
{
return seqType;
}
return ienum.GetGenericArguments()[0];
}
///
/// Determines whether a property is private
///
/// The PropertyInfo structure for the property
/// true/ false if property is private
internal static bool IsPrivate(PropertyInfo pi)
{
MethodInfo mi = pi.GetGetMethod() ?? pi.GetSetMethod();
if (mi != null)
{
return mi.IsPrivate;
}
return true;
}
///
/// Finds type that implements IEnumerable so can get elemtent type
///
/// The Type to check
/// returns the type which implements IEnumerable
internal static Type FindIEnumerable(Type seqType)
{
if (seqType == null || seqType == typeof(string))
{
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;
}
}
}
// File provided for Reference Use Only by Microsoft Corporation (c) 2007.
//----------------------------------------------------------------------
//
// Copyright (c) Microsoft Corporation. All rights reserved.
//
//
// Utility functions for processing Expression trees
//
//
// @owner [....]
//---------------------------------------------------------------------
namespace System.Data.Services.Client
{
using System;
using System.Collections.Generic;
using System.Collections;
using System.Text;
using System.Reflection;
using System.Diagnostics;
using System.Linq;
/// Utility functions for processing Expression trees
internal static class TypeSystem
{
/// Method map for methods in URI query options
private static readonly Dictionary expressionMethodMap;
/// VB Method map for methods in URI query options
private static readonly Dictionary expressionVBMethodMap;
/// Properties that should be represented as methods
private static readonly Dictionary propertiesAsMethodsMap;
/// VB Assembly name
#if !ASTORIA_LIGHT
private const string VisualBasicAssemblyFullName = "Microsoft.VisualBasic, Version=8.0.0.0, Culture=neutral, PublicKeyToken=" + AssemblyRef.MicrosoftPublicKeyToken;
#else
private const string VisualBasicAssemblyFullName = "Microsoft.VisualBasic, Version=2.0.5.0, Culture=neutral, PublicKeyToken=" + AssemblyRef.MicrosoftSilverlightPublicKeyToken;
#endif
///
/// Initializes method map
///
[System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Performance", "CA1810:InitializeReferenceTypeStaticFieldsInline", Justification = "Cleaner code")]
static TypeSystem()
{
// string functions
#if !ASTORIA_LIGHT
const int ExpectedCount = 24;
#else
const int ExpectedCount = 22;
#endif
expressionMethodMap = new Dictionary(ExpectedCount);
expressionMethodMap.Add(typeof(string).GetMethod("Contains", new Type[] { typeof(string) }), @"substringof");
expressionMethodMap.Add(typeof(string).GetMethod("EndsWith", new Type[] { typeof(string) }), @"endswith");
expressionMethodMap.Add(typeof(string).GetMethod("StartsWith", new Type[] { typeof(string) }), @"startswith");
expressionMethodMap.Add(typeof(string).GetMethod("IndexOf", new Type[] { typeof(string) }), @"indexof");
expressionMethodMap.Add(typeof(string).GetMethod("Replace", new Type[] { typeof(string), typeof(string) }), @"replace");
expressionMethodMap.Add(typeof(string).GetMethod("Substring", new Type[] { typeof(int) }), @"substring");
expressionMethodMap.Add(typeof(string).GetMethod("Substring", new Type[] { typeof(int), typeof(int) }), @"substring");
expressionMethodMap.Add(typeof(string).GetMethod("ToLower", Type.EmptyTypes), @"tolower");
expressionMethodMap.Add(typeof(string).GetMethod("ToUpper", Type.EmptyTypes), @"toupper");
expressionMethodMap.Add(typeof(string).GetMethod("Trim", Type.EmptyTypes), @"trim");
expressionMethodMap.Add(typeof(string).GetMethod("Concat", new Type[] { typeof(string), typeof(string) }, null), @"concat");
expressionMethodMap.Add(typeof(string).GetProperty("Length", typeof(int)).GetGetMethod(), @"length");
// datetime methods
expressionMethodMap.Add(typeof(DateTime).GetProperty("Day", typeof(int)).GetGetMethod(), @"day");
expressionMethodMap.Add(typeof(DateTime).GetProperty("Hour", typeof(int)).GetGetMethod(), @"hour");
expressionMethodMap.Add(typeof(DateTime).GetProperty("Month", typeof(int)).GetGetMethod(), @"month");
expressionMethodMap.Add(typeof(DateTime).GetProperty("Minute", typeof(int)).GetGetMethod(), @"minute");
expressionMethodMap.Add(typeof(DateTime).GetProperty("Second", typeof(int)).GetGetMethod(), @"second");
expressionMethodMap.Add(typeof(DateTime).GetProperty("Year", typeof(int)).GetGetMethod(), @"year");
// math methods
expressionMethodMap.Add(typeof(Math).GetMethod("Round", new Type[] { typeof(double) }), @"round");
expressionMethodMap.Add(typeof(Math).GetMethod("Round", new Type[] { typeof(decimal) }), @"round");
expressionMethodMap.Add(typeof(Math).GetMethod("Floor", new Type[] { typeof(double) }), @"floor");
#if !ASTORIA_LIGHT // Math.Floor(Decimal) not available
expressionMethodMap.Add(typeof(Math).GetMethod("Floor", new Type[] { typeof(decimal) }), @"floor");
#endif
expressionMethodMap.Add(typeof(Math).GetMethod("Ceiling", new Type[] { typeof(double) }), @"ceiling");
#if !ASTORIA_LIGHT // Math.Ceiling(Decimal) not available
expressionMethodMap.Add(typeof(Math).GetMethod("Ceiling", new Type[] { typeof(decimal) }), @"ceiling");
#endif
Debug.Assert(expressionMethodMap.Count == ExpectedCount, "expressionMethodMap.Count == ExpectedCount");
// vb methods
// lookup these by type name + method name
expressionVBMethodMap = new Dictionary();
expressionVBMethodMap.Add("Microsoft.VisualBasic.Strings.Trim", @"trim");
expressionVBMethodMap.Add("Microsoft.VisualBasic.Strings.Len", @"length");
expressionVBMethodMap.Add("Microsoft.VisualBasic.Strings.Mid", @"substring");
expressionVBMethodMap.Add("Microsoft.VisualBasic.Strings.UCase", @"toupper");
expressionVBMethodMap.Add("Microsoft.VisualBasic.Strings.LCase", @"tolower");
expressionVBMethodMap.Add("Microsoft.VisualBasic.DateAndTime.Year", @"year");
expressionVBMethodMap.Add("Microsoft.VisualBasic.DateAndTime.Month", @"month");
expressionVBMethodMap.Add("Microsoft.VisualBasic.DateAndTime.Day", @"day");
expressionVBMethodMap.Add("Microsoft.VisualBasic.DateAndTime.Hour", @"hour");
expressionVBMethodMap.Add("Microsoft.VisualBasic.DateAndTime.Minute", @"minute");
expressionVBMethodMap.Add("Microsoft.VisualBasic.DateAndTime.Second", @"second");
Debug.Assert(expressionVBMethodMap.Count == 11, "expressionVBMethodMap.Count == 11");
propertiesAsMethodsMap = new Dictionary();
propertiesAsMethodsMap.Add(
typeof(string).GetProperty("Length", typeof(int)),
typeof(string).GetProperty("Length", typeof(int)).GetGetMethod());
propertiesAsMethodsMap.Add(
typeof(DateTime).GetProperty("Day", typeof(int)),
typeof(DateTime).GetProperty("Day", typeof(int)).GetGetMethod());
propertiesAsMethodsMap.Add(
typeof(DateTime).GetProperty("Hour", typeof(int)),
typeof(DateTime).GetProperty("Hour", typeof(int)).GetGetMethod());
propertiesAsMethodsMap.Add(
typeof(DateTime).GetProperty("Minute", typeof(int)),
typeof(DateTime).GetProperty("Minute", typeof(int)).GetGetMethod());
propertiesAsMethodsMap.Add(
typeof(DateTime).GetProperty("Second", typeof(int)),
typeof(DateTime).GetProperty("Second", typeof(int)).GetGetMethod());
propertiesAsMethodsMap.Add(
typeof(DateTime).GetProperty("Month", typeof(int)),
typeof(DateTime).GetProperty("Month", typeof(int)).GetGetMethod());
propertiesAsMethodsMap.Add(
typeof(DateTime).GetProperty("Year", typeof(int)),
typeof(DateTime).GetProperty("Year", typeof(int)).GetGetMethod());
Debug.Assert(propertiesAsMethodsMap.Count == 7, "propertiesAsMethodsMap.Count == 7");
}
///
/// Sees if method has URI equivalent
///
/// The method info
/// uri method name
/// true/ false
internal static bool TryGetQueryOptionMethod(MethodInfo mi, out string methodName)
{
return (expressionMethodMap.TryGetValue(mi, out methodName) ||
(mi.DeclaringType.Assembly.FullName == VisualBasicAssemblyFullName &&
expressionVBMethodMap.TryGetValue(mi.DeclaringType.FullName + "." + mi.Name, out methodName)));
}
///
/// Sees if property can be represented as method for translation to URI
///
/// The property info
/// get method for property
/// true/ false
internal static bool TryGetPropertyAsMethod(PropertyInfo pi, out MethodInfo mi)
{
return propertiesAsMethodsMap.TryGetValue(pi, out mi);
}
///
/// Gets the elementtype for a sequence
///
/// The sequence type
/// The element type
internal static Type GetElementType(Type seqType)
{
Type ienum = FindIEnumerable(seqType);
if (ienum == null)
{
return seqType;
}
return ienum.GetGenericArguments()[0];
}
///
/// Determines whether a property is private
///
/// The PropertyInfo structure for the property
/// true/ false if property is private
internal static bool IsPrivate(PropertyInfo pi)
{
MethodInfo mi = pi.GetGetMethod() ?? pi.GetSetMethod();
if (mi != null)
{
return mi.IsPrivate;
}
return true;
}
///
/// Finds type that implements IEnumerable so can get elemtent type
///
/// The Type to check
/// returns the type which implements IEnumerable
internal static Type FindIEnumerable(Type seqType)
{
if (seqType == null || seqType == typeof(string))
{
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;
}
}
}
// 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
- FunctionUpdateCommand.cs
- COAUTHINFO.cs
- SqlInternalConnectionTds.cs
- EnterpriseServicesHelper.cs
- LazyTextWriterCreator.cs
- RecordManager.cs
- HttpCacheVaryByContentEncodings.cs
- UserControl.cs
- SymbolType.cs
- WaitHandle.cs
- RenderContext.cs
- FontFaceLayoutInfo.cs
- XPathBinder.cs
- GradientSpreadMethodValidation.cs
- DiagnosticsConfigurationHandler.cs
- PagedDataSource.cs
- IntellisenseTextBox.designer.cs
- SafeNativeMethods.cs
- EdmMember.cs
- OleDbErrorCollection.cs
- WebPartConnectionsDisconnectVerb.cs
- HttpCapabilitiesBase.cs
- CodeNamespaceCollection.cs
- PtsContext.cs
- SoapObjectInfo.cs
- UnsafeNativeMethods.cs
- OracleDataReader.cs
- TableFieldsEditor.cs
- DocumentGridPage.cs
- ServiceNameElement.cs
- FunctionDefinition.cs
- JsonReader.cs
- columnmapfactory.cs
- designeractionbehavior.cs
- KeyInterop.cs
- OutgoingWebResponseContext.cs
- AuthenticateEventArgs.cs
- HyperLinkField.cs
- ExceptionCollection.cs
- TextEditorContextMenu.cs
- TaiwanLunisolarCalendar.cs
- Assign.cs
- Base64Stream.cs
- OutputCacheSettingsSection.cs
- SafeProcessHandle.cs
- DotNetATv1WindowsLogEntrySerializer.cs
- DbConnectionPoolCounters.cs
- SchemaCollectionPreprocessor.cs
- SettingsAttributes.cs
- Evaluator.cs
- Site.cs
- ExtendedProtectionPolicyElement.cs
- ModelTreeManager.cs
- PointAnimationBase.cs
- CollectionChangeEventArgs.cs
- InheritanceContextHelper.cs
- ComponentCodeDomSerializer.cs
- WebConfigurationHostFileChange.cs
- LocatorManager.cs
- NativeMethods.cs
- UTF8Encoding.cs
- SamlAdvice.cs
- XmlIncludeAttribute.cs
- LockCookie.cs
- WebBrowserUriTypeConverter.cs
- UriSectionReader.cs
- StylusPointCollection.cs
- ConnectionConsumerAttribute.cs
- SchemaObjectWriter.cs
- _CookieModule.cs
- SQLStringStorage.cs
- InteropTrackingRecord.cs
- StorageScalarPropertyMapping.cs
- EntryPointNotFoundException.cs
- SignedInfo.cs
- TranslateTransform3D.cs
- ParsedRoute.cs
- WebBrowserNavigatingEventHandler.cs
- SimpleHandlerBuildProvider.cs
- VisualCollection.cs
- TextWriterEngine.cs
- ObjectListCommandEventArgs.cs
- SystemResourceHost.cs
- DateTimeStorage.cs
- ObjectDataSourceFilteringEventArgs.cs
- ToolStripLabel.cs
- x509utils.cs
- XmlSerializer.cs
- InputProcessorProfilesLoader.cs
- Decimal.cs
- NegotiateStream.cs
- EncryptedData.cs
- WithStatement.cs
- XmlParserContext.cs
- ProcessThreadCollection.cs
- AutoResizedEvent.cs
- SystemPens.cs
- RightsManagementEncryptedStream.cs
- KeyBinding.cs
- CrossContextChannel.cs